Python - 执行进程 -> 阻塞至退出并抑制输出
我正在使用下面的代码来执行一个进程,并且想要在Python中隐藏它的输出。不过这个代码是在一个循环里运行的,我需要一种方法来确保在进入下一次循环之前,子进程已经结束。
subprocess.Popen(["scanx", "--udp", host], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
2 个回答
8
如果你根本不需要任何输出,可以把一个叫做 devnull 的东西传给 stdout
和 stderr
。我不确定这样做是否会有区别,但可以传一个 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()