2013-01-22 30 views
3

對於如何完成此操作,我有點困惑。在Python中調用具有混合數據類型參數的子進程

我需要做的是從Python腳本中調用一個外部命令,該命令需要輸入多個參數和一個文件名。

讓我們叫,我叫「前衛」的可執行文件,輸入文件「文件」,因此命令行(Bash終端)看起來像這樣:

$ prog --{arg1} {arg2} < {file} 

在上面{ARG1}是一個字符串,{arg2}是一個整數。

如果我使用以下內容:

#!/usr/bin/python 
import subprocess as sbp 
sbp.call(["prog","--{arg1}","{arg2}","<","{file}"]) 

結果被從「PROG」的輸出誤差,在那裏它聲稱,輸入缺失{ARG2}

下面產生一個有趣的錯誤:

#!/usr/bin/python 
import subprocess as sbp 
sbp.call(["prog","--{arg1} {arg2} < {file}"]) 

所有的空間似乎已經從第二個字符串,並在後面加上等號刪除:

command not found --{arg1}{arg2}<{file}= 

這些行爲似乎對我沒有任何意義,並且沒有太多可以通過在線找到的Python手冊頁。請注意,用sbp.Popen替換sbp.call並不能解決問題。

回答

4

問題是< {file}實際上並不是程序的參數,而是shell設置重定向的語法。你可以告訴Python使用shell,或者你可以自己設置重定向。

from subprocess import * 

# have shell interpret redirection 
check_call('wc -l < /etc/hosts', shell=True) 

# set up redirection in Python 
with open('/etc/hosts', 'r') as f: 
    check_call(['wc', '-l'], stdin=f.fileno()) 

第一種方法的優點是鍵入的速度更快,更容易。儘管如此,它有很多缺點:它在啓動一個shell之後可能會比較慢;它可能不可移植,因爲它取決於操作系統shell的語法;當文件名中有空格或其他特殊字符時,它很容易中斷。

所以第二種方法是優選的。

+0

這兩種方法都很好。正如你所說,鍵入第一種方法會更快,但如果多次調用,方法2最終可能會更快。 – da5id

+0

後續行動:有沒有辦法在某種列表中捕獲方法2中第二行的輸出? – da5id

+1

['subprocess.check_output()'](http://docs.python.org/2/library/subprocess.html#subprocess.check_output)函數將返回命令的輸出,而不是其返回碼。 – andrewdotn

相關問題