10

我在 Windows 上运行 Python 2.5,并且在我拥有的代码中的某处

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

通过pid杀死IE窗口。问题是,如果没有在 Popen 中设置管道,我仍然会输出到控制台 - 成功:PID 2068 的进程已终止。我将它调试到 subprocess.py 中的 CreateProcess,但不能从那里开始。

任何人都知道如何禁用此功能?

4

2 回答 2

16
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)
于 2009-08-07T19:58:22.100 回答
9
fh = open("NUL","w")
subprocess.Popen("taskkill /PID " + str(p.pid), stdout = fh, stderr = fh)
fh.close()
于 2009-08-07T13:41:08.827 回答