2010-04-01 60 views

回答

7

使用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() 
+0

与poll()不同,这里存在死锁的危险。 – 2010-04-01 16:27:30

+0

@Tommy,好点。在我的答案中扩展了这一点。谢谢。 – 2010-04-01 16:42:38

+0

非常感谢谢谢:) – 2010-04-01 16:53:41

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) 
+0

在我的情况下,如果我仍在使用“stdout = subprocess.Pipe”,“bufsize = x”不能解决我的问题。但是“stdout = null”运行良好。然而,python已经允许你使用“stdout = None”,它可以代替你的null变量,这在这里有点无用。 ;) – ForceMagic 2011-02-14 21:46:07

+0

它不一样,“...有无,不会发生重定向;孩子的文件句柄将从父类继承...”insted使用我的示例,您将所有输出重定向到一个空设备。 – 2011-11-11 09:44:41