Python subprocess.Popen而不加入

Python subprocess.Popen而不加入,python,subprocess,Python,Subprocess,目前,上面的代码挂起在stdout上,stderr=p.communicate(),因为myscript 永远运行 如何使p.communicate()不阻塞?i、 e.只需运行命令并继续communicate()需要阻止,因为它要求将stdout和stderr作为字符串返回(并且明确定义为等待终止)。只要远程进程在没有关闭这些管道的情况下运行,仍然可能有更多的内容要添加到这些字符串中,因此它们还不能返回 消除communicate()(以及管道,因为如果从未读取,管道可能会充满,并以这种方式

目前,上面的代码挂起在stdout上,stderr=p.communicate(),因为
myscript
永远运行

如何使
p.communicate()
不阻塞?i、 e.只需运行命令并继续

communicate()
需要阻止,因为它要求将stdout和stderr作为字符串返回(并且明确定义为等待终止)。只要远程进程在没有关闭这些管道的情况下运行,仍然可能有更多的内容要添加到这些字符串中,因此它们还不能返回


消除
communicate()
(以及管道,因为如果从未读取,管道可能会充满,并以这种方式造成阻塞):


如果循环中的下一个元素不断覆盖
stdout
stderr
变量,为什么要进行
communicate()
呢?好的,谢谢!我的理解是,在调用communicate之前,“p”实际上不会执行cmd……对于这里的使用模式,您甚至可以完全消除
p
,并使整行
子流程.Popen(cmd)
。对其进行了清理,以建议一种模式,使所有进程都被引用,因此不易受到垃圾收集的攻击。@ealeon:这种理解是不正确的
Popen()
启动子进程(POSIX上的fork()+exec())--
不需要通信()
。如果你愿意的话。看是否
for host in hosts:
    cmd = ['rsh', host, 'myscript']
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = p.communicate()
processes = [ subprocess.Popen(['rsh', host, 'myscript']) for host in hosts ]