我正在使用以下命令执行进程并从Python隐藏其输出。它在循环中,我需要一种方法来阻止,直到子进程终止,然后再转到下一次迭代。
subprocess.Popen(["scanx", "--udp", host], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
答案 0 :(得分:7)
使用subprocess.call()
。来自文档:
subprocess.call(* popenargs,** kwargs)
使用参数运行命令。等待命令完成,然后 返回returncode属性。 这些论点与 Popen构造函数。
修改强>
subprocess.call()
使用wait()
,而wait()
容易受到死锁(正如Tommy Herbert指出的那样)。来自文档:
警告:如果是这将会死锁 子进程生成足够的输出 到这样的stdout或stderr管道 它阻止等待OS管道 缓冲区接受更多数据。使用 communication()以避免这种情况。
因此,如果您的命令生成大量输出,请改为使用communicate()
:
p = subprocess.Popen(
["scanx", "--udp", host],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = p.communicate()
答案 1 :(得分:7)
如果您根本不需要输出,则可以将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)