2012-01-05 17 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

相關問題