Python subprocess.Popen挂起'for p in p.stdout'直到p终止,为什么?

时间:2010-05-14 22:28:19

标签: python subprocess popen

我有那段代码:

#!/usr/bin/python -u

localport = 9876

import sys, re, os
from subprocess import *

tun = Popen(["./newtunnel", "22", str(localport)], stdout=PIPE, stderr=STDOUT)

print "** Started tunnel, waiting to be ready ..."
for l in tun.stdout:
        sys.stdout.write(l)
        if re.search("Waiting for connection", l):
                print "** Ready for SSH !"
                break

“./newtunnel”不会退出,它会不断向stdout输出越来越多的数据。但是,该代码不会提供任何输出,只是在tun.stdout中等待。

当我从外部杀死newtunnel进程时,它会将所有数据刷新到tun.stdout。所以我似乎无法从tun.stdout获取任何数据,而它仍在运行。

为什么?我怎样才能获得这些信息?

请注意,Popen的默认bufsize为0(无缓冲)。我也可以指定bufsize = 0,但这不会改变任何东西。

1 个答案:

答案 0 :(得分:2)

好吧,这似乎是Python中的一个错误:http://bugs.python.org/issue3907

如果我换行

for l in tun.stdout:

通过

while True:
    l = tun.stdout.readline()

然后它按照我想要的方式工作。