2012-01-05 16 views
2

我尝试使用Popen创建子进程。这里是我的代码在第一次:Python - 在Popen中使用列表作为命令

hostname = 'host' 
servername = 'server' 
commandargs = ['/usr/sbin/mminfo',' -o n',' -s',servername,' -q "client=\'',hostname,'\',savetime>=last day"',' -r "client,name"'] 
process = subprocess.Popen(commandargs, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

的问题是执行命令的消息失败,该联系的服务器不可用。似乎变量主机名不被使用... 尝试使用一个字符串,而不是一个列表,作为Popen命令(壳牌= True),一切工作正常。

有人知道代码有什么问题吗?

问候。 Stefan

+0

不要引用主机名,没有必要。有效的主机名不包含任何可能会扩展为奇怪的字符,也不会有空格。你应该做的另一件事是让命令中的每个实体分开,不要做'-o n',而是'-o','n'等。 – synthesizerpatel 2012-01-05 14:09:03

+0

hostname ='host' 你的意思是说^ ?这是我用测试主机名填充变量的测试。 – StefanS 2012-01-05 14:14:47

回答

3

给定列表中的每个字符串都作为单个命令行参数处理。使用此语法时,您也不需要使用引号。

尝试这样:

hostname = 'host' 
servername = 'server' 
commandargs = [ 
    '/usr/sbin/mminfo', 
    '-o', 'n', # these are separate arguments, but on the same line for clarity's sake 
    '-s', servername, # same here 
    '-q', "client='%s',savetime>=last day" % hostname, # same here... 
    '-r', 'client,name' # and here. 
] 
process = subprocess.Popen(commandargs, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

编辑:或者,根据意见,像

import subprocess 

client_name = "lxds05" 
server_name = "nsr_srv" 

queryspec = "client='%s',savetime>=last day" % client_name 
reportspec = "client,name,savetime(17),nsavetime,level,ssflags" 

args = [ 
    '/usr/sbin/mminfo', 
    '-o', 'n', 
    '-s', server_name, 
    '-q', queryspec, 
    '-r', reportspec, 
    '-x', 'c' 
] 

subprocess.Popen(args) # ... etc 
+0

commandargs = [ '/ usr/sbin/mminfo', '-o','n', '-s',servername, '-q',''client ='',hostname,'\' ,savetime> = last','','day'', '-r',''client,name,savetime(17),nsavetime,level,ssflags'', '-x','“c; “', '| sed','”1d“'] – StefanS 2012-01-05 14:27:31

+0

如果没有'shell'参数,使用管道将无法工作,但是如果您只使用'sed'来删除一行,那么您也可以在Python中也是这样做的。 – AKX 2012-01-05 14:27:58

+0

对不起,我的贴子,:-(,我试图把编辑列表放在这里。 – StefanS 2012-01-05 14:29:34

6

在列表中,每个参数必须是它自己的项目。字符串中不应有空格:

commandargs = ['/usr/sbin/mminfo', '-o', 'n', '-s', servername, 
       '-q', "client='" + hostname + "',savetime>=last day", 
       '-r', 'client,name'] 
+0

谢谢,这是工作正常。只有“最后一天”有一个空白。它有特殊的性格吗? – StefanS 2012-01-05 14:39:08

+1

@StefanS不,列表的要点恰恰是让子过程完成所有的转义。 – phihag 2012-01-05 14:56:21

+0

好的,和一个像''这样的字符是什么,我必须逃避它吗? – StefanS 2012-01-05 15:07:11

相关问题