Python - 执行过程 - >阻止它离开&抑制输出

时间:2010-04-01 16:20:26

标签: python subprocess

我正在使用以下命令执行进程并从Python隐藏其输出。它在循环中,我需要一种方法来阻止,直到子进程终止,然后再转到下一次迭代。

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

2 个答案:

答案 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传递给stdoutstderr。我不知道这是否有所作为,但通过bufsize。现在使用devnull subprocess.call不会再遇到死锁

import os
import subprocess

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