我尝试用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)
问题是执行的命令失败并显示一条消息,联系的服务器不可用。似乎没有使用变量hostname ...... 尝试使用字符串而不是列表作为Popen中的命令(使用Shell = True)一切正常。
有谁知道代码有什么问题?
的问候。 斯蒂芬
答案 0 :(得分:7)
在列表中,每个参数都必须是自己的项目。字符串中不应有空格:
commandargs = ['/usr/sbin/mminfo', '-o', 'n', '-s', servername,
'-q', "client='" + hostname + "',savetime>=last day",
'-r', 'client,name']
答案 1 :(得分:4)
给定列表中的每个字符串都作为单个命令行参数处理。使用此语法时也不需要使用引号。
尝试这样的事情:
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