Python - 执行进程 -> 阻塞至退出并抑制输出

10 投票
2 回答
7395 浏览
提问于 2025-04-15 21:07

我正在使用下面的代码来执行一个进程,并且想要在Python中隐藏它的输出。不过这个代码是在一个循环里运行的,我需要一种方法来确保在进入下一次循环之前,子进程已经结束。

subprocess.Popen(["scanx", "--udp", host], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

2 个回答

8

如果你根本不需要任何输出,可以把一个叫做 devnull 的东西传给 stdoutstderr。我不确定这样做是否会有区别,但可以传一个 bufsize。现在使用 devnull 的话,subprocess.call 就不会再出现死锁的问题了。

import os
import subprocess

null = open(os.devnull, 'w')
subprocess.call(['ls', '-lR'], bufsize=4096, stdout=null, stderr=null)
8

使用 subprocess.call()。根据文档的说明:

subprocess.call(*popenargs, **kwargs)
运行带有参数的命令。等待命令完成后,返回返回码属性。
参数和 Popen 构造函数的参数是一样的。

补充说明:

subprocess.call() 使用 wait(),而 wait() 可能会出现死锁(正如 Tommy Herbert 指出的那样)。根据文档:

警告:如果子进程生成的输出足够多,导致它在等待操作系统管道缓冲区接受更多数据时被阻塞,这将导致死锁。使用 communicate() 可以避免这个问题。

所以,如果你的命令生成了很多输出,建议使用 communicate() 来替代:

p = subprocess.Popen(
    ["scanx", "--udp", host],
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE)
out, err = p.communicate()

撰写回答