2009-08-07 111 views
8

我在Windows上運行Python 2.5,並且在某個地方的代碼我有輸出禁用控制檯在Python

subprocess.Popen("taskkill /PID " + str(p.pid)) 

通過kill命令來殺死IE窗口。問題是,如果沒有在Popen中設置管道,我仍然會輸出到控制檯 - SUCCESS:PID 2068的過程已終止。我將它調試到subprocess.py中的CreateProcess,但不能從那裏去。

任何人都知道如何禁用它?

+0

什麼是subprocess.Popen( 「TASKKILL/PID」 + STR(p.pid)+「的問題> NUL「)? – 2009-08-07 13:50:16

+0

也許是因爲python在Windows上運行?它說「>」不是taskkill命令的有效選項 – 2009-08-07 14:12:08

+1

我首先試過,出於某種原因,它不能正確解析。 >>>錯誤:無效的參數/選項 - '>'。 輸入「TASKKILL /?」供使用。 儘管在cmd行上工作。 – Mark 2009-08-07 14:14:08

回答

7
fh = open("NUL","w") 
subprocess.Popen("taskkill /PID " + str(p.pid), stdout = fh, stderr = fh) 
fh.close() 
+0

謝謝!這件作品確實有效。我完全忘了NUL。 – 2009-08-07 14:12:47

+3

我認爲那裏存在競爭條件 - 您可能在子流程完成之前關閉管道並導致其提前終止。 – 2009-08-07 20:01:35

+0

@chrispy - 你是對的,我認爲應該有一個.communicate()在那裏 – orip 2009-11-08 12:26:43

11
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)