我正在使用以下來執行進程並隱藏其從Python的輸出。它在一個循環中,我需要一種方法來阻止,直到子進程終止,然後再轉到下一次迭代。Python - 執行進程 - >阻止,直到它退出&抑制輸出
subprocess.Popen(["scanx", "--udp", host], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
我正在使用以下來執行進程並隱藏其從Python的輸出。它在一個循環中,我需要一種方法來阻止,直到子進程終止,然後再轉到下一次迭代。Python - 執行進程 - >阻止,直到它退出&抑制輸出
subprocess.Popen(["scanx", "--udp", host], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
使用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()
如果你不需要在你的輸出可以通過devnull到stdout
和stderr
。我不知道這是否會有所作爲,但通過bufsize。現在使用devnull subprocess.call
不會再遇到死鎖
import os
import subprocess
null = open(os.devnull, 'w')
subprocess.call(['ls', '-lR'], bufsize=4096, stdout=null, stderr=null)
在我的情況下,如果我仍在使用「stdout = subprocess.Pipe」,「bufsize = x」不能解決我的問題。但是「stdout = null」運行良好。然而,python已經允許你使用「stdout = None」,它可以代替你的null變量,這在這裏有點無用。 ;) – ForceMagic 2011-02-14 21:46:07
它不一樣,「...有無,不會發生重定向;孩子的文件句柄將從父類繼承...」insted使用我的示例,您將所有輸出重定向到一個空設備。 – 2011-11-11 09:44:41
與poll()不同,這裏存在死鎖的危險。 – 2010-04-01 16:27:30
@Tommy,好點。在我的答案中擴展了這一點。謝謝。 – 2010-04-01 16:42:38
非常感謝謝謝:) – 2010-04-01 16:53:41