在Python中禁用子进程(subprocess.Popen)的控制台输出

11

我在Windows上运行Python 2.5,代码中有以下内容:

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

如何通过 pid 来关闭IE窗口。问题是,即使在 Popen 中没有设置管道,仍然会在控制台输出 SUCCESS: The process with PID 2068 has been terminated。我在 subprocess.py 的 CreateProcess 中进行了调试,但无法从那里继续。

有人知道如何禁用这个吗?


subprocess.Popen("taskkill /PID " + str(p.pid) + " > NUL")有什么问题? - Svetlozar Angelov
可能是因为Python在Windows上运行?它说'>'不是taskkill命令的有效选项。 - Denis Masyukov
1
我先尝试了一下,但不知何故它无法正确解析。
错误:无效的参数/选项 - '>' 键入“TASKKILL /?”以获取用法。
不过在命令行上可以正常工作。
- Mark
2个回答

18
from subprocess import check_call, DEVNULL, STDOUT

check_call(
    ("taskkill", "/PID", str(p.pid)),
    stdout=DEVNULL,
    stderr=STDOUT,
)

我总是将元组(或列表)作为参数传递给子进程,这样可以避免担心转义问题。check_call 确保子进程在管道关闭之前完成,并且调用过程中的失败不会被忽略。

如果你使用Python 2,subprocess 没有提供 DEVNULL。但是,你可以通过打开 os.devnull 来模拟它(Python 2.4+ 中表示“NUL”的标准跨平台方法):

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

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

谢谢!这段代码确实有效。我完全忘记了 NUL。 - Denis Masyukov
3
我觉得那里存在竞态条件 - 你可能会在子进程完成之前关闭管道,导致它提前终止。 - Alice Purcell
@chrispy - 你说得对,我认为应该在那里加上一个.communicate()。 - orip
@chrispy,@orip: 其实,答案不是在子进程行中添加.wait()吗? - Harvey
只是一个愚蠢的问题:我想做完全相同的事情,但我不明白为什么stdout=None会阻止线程显示内容... - nbarraille
5
你可以更好地使用os.devnull而不是"NUL",因为它是跨平台的。Windows使用'nul',Linux使用'/dev/null'。 - Melroy van den Berg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接