2010-04-01 48 views

回答

7

使用subprocess.call()。從文檔:

subprocess.call(* popenargs,** kwargs)
帶參數運行命令。等待命令完成,然後 返回returncode屬性。 參數與 Popen構造函數的參數相同。

編輯:

subprocess.call()使用wait(),和wait()易受死鎖(如托米赫伯特指出)。從文檔:

警告:如果 子進程產生足夠的輸出 到標準輸出或標準錯誤管道,使得 它會阻止等待操作系統管 緩衝接受更多的數據這將死鎖。溝通()使用 來避免這種情況。

所以,如果你的命令生成大量的輸出,使用communicate()代替:

p = subprocess.Popen(
    ["scanx", "--udp", host], 
    stdin=subprocess.PIPE, 
    stdout=subprocess.PIPE, 
    stderr=subprocess.PIPE) 
out, err = p.communicate() 
+0

與poll()不同,這裏存在死鎖的危險。 – 2010-04-01 16:27:30

+0

@Tommy,好點。在我的答案中擴展了這一點。謝謝。 – 2010-04-01 16:42:38

+0

非常感謝謝謝:) – 2010-04-01 16:53:41

7

如果你不需要在你的輸出可以通過devnull到stdoutstderr。我不知道這是否會有所作爲,但通過bufsize。現在使用devnull subprocess.call不會再遇到死鎖

import os 
import subprocess 

null = open(os.devnull, 'w') 
subprocess.call(['ls', '-lR'], bufsize=4096, stdout=null, stderr=null) 
+0

在我的情況下,如果我仍在使用「stdout = subprocess.Pipe」,「bufsize = x」不能解決我的問題。但是「stdout = null」運行良好。然而,python已經允許你使用「stdout = None」,它可以代替你的null變量,這在這裏有點無用。 ;) – ForceMagic 2011-02-14 21:46:07

+0

它不一樣,「...有無,不會發生重定向;孩子的文件句柄將從父類繼承...」insted使用我的示例,您將所有輸出重定向到一個空設備。 – 2011-11-11 09:44:41