在Python中禁用subprocess.Popen的控制台输出

Den*_*kov 8 python console subprocess popen

我在Windows上运行Python 2.5,在我的代码中的某处

subprocess.Popen("taskkill /PID " + str(p.pid))
Run Code Online (Sandbox Code Playgroud)

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

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

Ali*_*ell 13

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()
Run Code Online (Sandbox Code Playgroud)

我总是将元组传递给子进程,因为它让我担心逃避.check_call确保(a)子流程在管道关闭之前完成,(b)不忽略被调用流程中的故障.最后,os.devnullNULPython 2.4+中标准的,跨平台的说法.

请注意,在Py3K中,子进程为您提供了DEVNULL,因此您只需编写:

from subprocess import check_call, DEVNULL, STDOUT

check_call(("taskkill", "/PID", str(p.pid)), stdout=DEVNULL, stderr=STDOUT)
Run Code Online (Sandbox Code Playgroud)


Mar*_*ark 7

fh = open("NUL","w")
subprocess.Popen("taskkill /PID " + str(p.pid), stdout = fh, stderr = fh)
fh.close()
Run Code Online (Sandbox Code Playgroud)

  • 我认为那里存在竞争条件 - 您可以在子进程完成之前关闭管道并使其提前终止. (3认同)
  • 您可以更好地使用:os.devnull而不是"NUL",因为这是跨平台的.Windows使用:'nul',Linux使用:'/ dev/null'. (2认同)