我的问题有点类似于这个问题。
我尝试从Python与Jython程序通信(需要保持运行,因为它与Java API通信)。
然而,我不能得到实时的输出,无论我尝试:
p2=Popen([path_jython],stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=False)
p2.stdin.write('test="hallo"n')
p2.stdin.write('print testn')
p2.stdin.flush()
for line in p2.stdout:
print line
什么也没发生,程序阻塞。当我迭代p2.stdout.readlines()
或iter(md5.stdout.readline, '')
时,或者当我像链接问题中建议的那样反复调用p2.stdout.read(1)
时,它不会改变。
如果我在flush()
之后添加print p2.communicate()
,但是,我得到所需的输出:
>>> ('hallorn', 'rn')
但是程序随后终止…
谁有解决这个问题的办法?或者是否存在与正在运行的Jython进程进行有效通信的替代方案?欢迎任何建议!编辑:Python 2.7.5, Jython 2.7.1b
- 尝试使
jython
stdout/stderr无缓冲,传递-u
命令行参数 - 如果你设置了
stderr=PIPE
,那么你应该读取它,否则如果子进程填满了对应于它的stderr的OS管道缓冲区,可能会发生死锁。您可以将其重定向到stdout:stderr=STDOUT
- 显式设置Python侧缓冲:
bufsize=1
(line- buffers) - 使用
iter(p.stdout.readline, '')
来避免Python 2的预读错误
from subprocess import Popen, PIPE, STDOUT
p = Popen(['jython', '-u', ...], stdin=PIPE, stdout=PIPE, stderr=STDOUT,
bufsize=1)
print >>p.stdin, 'test="hallo"' #NOTE: it uses `os.linesep`
print >>p.stdin, 'print test'
p.stdin.close() # + implicit .flush()
for line in iter(p.stdout.readline, ''):
print line, #NOTE: comma -- softspace hack to avoid duplicate newlines
p.stdout.close()
rc = p.wait()