2015-08-14 54 views
0

我寫的,我大約4個月前經常使用FUNC,我有我爲什麼拆東西了,記不住像這樣:優勢= subprocess.Popen() - > sp.communicate()VS subprocess.call()

def call_sp(command, **arg_list): 
    #run that beast 
    p = subprocess.Popen(command, shell=True, **arg_list) 
    p.communicate() 

我讀了關於子流程的文檔,看到call()基本上做了同樣的事情。如果不記得那一天發生了什麼,除了上面的func和subprocess.call([「mycommand」])之外,任何python系統管理員都知道使用中有意義的區別嗎?我看到我的func沒有返回任何退出狀態,正在檢查命令是否是call()的唯一區別/優勢?這是我今天看到

In [4]: subprocess.call(['echo $HOME'], shell=True) 
/home/cchilders 
Out[4]: 0 

In [5]: %paste 
def call_sp(command, **arg_list): 
    #run that beast 
    p = subprocess.Popen(command, shell=True, **arg_list) 
    p.communicate() 

## -- End pasted text -- 


In [6]: call_sp('echo $HOME') 
/home/cchilders 

感謝

+1

'subprocess.call'確實只是這種情況的一個方便。也許你計劃用'p'('Popen'實例)做其他事情,但從來沒有? (事實上​​,你可以定義'call_cp = subprocess.call'。) – chepner

回答

2

subprocess.call(..)基本上是Popen(..).wait()如果您重定向任何子進程的標準流例如,stdout=PIPE或者如果你需要退出狀態是從Popen(..).communicate()不同。

subprocess.call()是一個方便的功能,建立在Popen()提供的接口之上。如果call()適用於您的情況;用它。如果不起作用;考慮其他便利功能,如subprocess.check_output(),然後直接使用Popen()

編寫一個方便的功能,你會在你的情況下工作是一個好主意,一般(雖然你的具體的例子是用處不大)。 Popen()可以做很多事情,而一種限制其功能的便利功能使代碼更容易維護。

除非你需要通過輸入,您可以通過子輸出別叫p.communicate()。請勿使用shell=True,除非您有完成控制參數command

1

call是的Popen一個典型的使用情況便利的功能。在這種情況下使用它更簡單,而不是使用Popen構造函數,因爲您沒有使用執行命令的輸出。

如果需要與正在運行的子進程交換一些數據或進一步處理命令輸出(標準輸出,標準錯誤)Popencommunicate會更好。

如果您對調用的成功感興趣,還有另一個便利函數check_call,如果執行的進程以非零狀態退出,將引發異常。