我在Windows上運行Python 2.5,並且在某個地方的代碼我有輸出禁用控制檯在Python
subprocess.Popen("taskkill /PID " + str(p.pid))
通過kill命令來殺死IE窗口。問題是,如果沒有在Popen中設置管道,我仍然會輸出到控制檯 - SUCCESS:PID 2068的過程已終止。我將它調試到subprocess.py中的CreateProcess,但不能從那裏去。
任何人都知道如何禁用它?
我在Windows上運行Python 2.5,並且在某個地方的代碼我有輸出禁用控制檯在Python
subprocess.Popen("taskkill /PID " + str(p.pid))
通過kill命令來殺死IE窗口。問題是,如果沒有在Popen中設置管道,我仍然會輸出到控制檯 - SUCCESS:PID 2068的過程已終止。我將它調試到subprocess.py中的CreateProcess,但不能從那裏去。
任何人都知道如何禁用它?
fh = open("NUL","w")
subprocess.Popen("taskkill /PID " + str(p.pid), stdout = fh, stderr = fh)
fh.close()
謝謝!這件作品確實有效。我完全忘了NUL。 – 2009-08-07 14:12:47
我認爲那裏存在競爭條件 - 您可能在子流程完成之前關閉管道並導致其提前終止。 – 2009-08-07 20:01:35
@chrispy - 你是對的,我認爲應該有一個.communicate()在那裏 – orip 2009-11-08 12:26:43
import os
from subprocess import check_call, STDOUT
DEVNULL = open(os.devnull, 'wb')
try:
check_call(("taskkill", "/PID", str(p.pid)), stdout=DEVNULL, stderr=STDOUT)
finally:
DEVNULL.close()
我總是傳遞元組子過程,因爲它節省了我的擔心逃跑。 check_call確保(a)在管道關閉之前子過程已經完成,並且(b)被調用過程中的失敗不被忽略。最後,os.devnull
是在Python 2.4+中稱爲NUL
的標準跨平臺方式。
注意,在Py3K,子提供DEVNULL你,所以你可以這樣寫:
from subprocess import check_call, DEVNULL, STDOUT
check_call(("taskkill", "/PID", str(p.pid)), stdout=DEVNULL, stderr=STDOUT)
什麼是subprocess.Popen( 「TASKKILL/PID」 + STR(p.pid)+「的問題> NUL「)? – 2009-08-07 13:50:16
也許是因爲python在Windows上運行?它說「>」不是taskkill命令的有效選項 – 2009-08-07 14:12:08
我首先試過,出於某種原因,它不能正確解析。 >>>錯誤:無效的參數/選項 - '>'。 輸入「TASKKILL /?」供使用。 儘管在cmd行上工作。 – Mark 2009-08-07 14:14:08