我正在使用以下来执行进程并隐藏其从Python的输出。它在一个循环中,我需要一种方法来阻止,直到子进程终止,然后再转到下一次迭代。Python - 执行进程 - >阻止,直到它退出&抑制输出
subprocess.Popen(["scanx", "--udp", host], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
我正在使用以下来执行进程并隐藏其从Python的输出。它在一个循环中,我需要一种方法来阻止,直到子进程终止,然后再转到下一次迭代。Python - 执行进程 - >阻止,直到它退出&抑制输出
subprocess.Popen(["scanx", "--udp", host], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
使用subprocess.call()
。从文档:
subprocess.call(* popenargs,** kwargs)
带参数运行命令。等待命令完成,然后 返回returncode属性。 参数与 Popen构造函数的参数相同。
编辑:
subprocess.call()
使用wait()
,和wait()
易受死锁(如托米赫伯特指出)。从文档:
警告:如果 子进程产生足够的输出 到标准输出或标准错误管道,使得 它会阻止等待操作系统管 缓冲接受更多的数据这将死锁。沟通()使用 来避免这种情况。
所以,如果你的命令生成大量的输出,使用communicate()
代替:
p = subprocess.Popen(
["scanx", "--udp", host],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = p.communicate()
如果你不需要在你的输出可以通过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)
在我的情况下,如果我仍在使用“stdout = subprocess.Pipe”,“bufsize = x”不能解决我的问题。但是“stdout = null”运行良好。然而,python已经允许你使用“stdout = None”,它可以代替你的null变量,这在这里有点无用。 ;) – ForceMagic 2011-02-14 21:46:07
它不一样,“...有无,不会发生重定向;孩子的文件句柄将从父类继承...”insted使用我的示例,您将所有输出重定向到一个空设备。 – 2011-11-11 09:44:41
与poll()不同,这里存在死锁的危险。 – 2010-04-01 16:27:30
@Tommy,好点。在我的答案中扩展了这一点。谢谢。 – 2010-04-01 16:42:38
非常感谢谢谢:) – 2010-04-01 16:53:41