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

11 投票
2 回答
12951 浏览
提问于 2025-04-15 13:27

我在Windows上运行Python 2.5,代码里有一段

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

是用来通过进程ID来关闭IE窗口的。问题是,即使我没有在Popen中设置管道,我还是会在控制台看到输出 - 成功:进程ID为2068的进程已经被终止。我调试到subprocess.py里的CreateProcess,但不知道接下来该怎么做。

有没有人知道怎么关闭这个输出?

2 个回答

18
from subprocess import check_call, DEVNULL, STDOUT

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

我总是把元组(或列表)传给子进程,这样我就不用担心转义的问题了。check_call 确保了 (a) 子进程在管道关闭 之前 已经完成,(b) 被调用的进程出错时不会被忽略。

如果你还在用 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()

撰写回答