从Python(子进程)与Jython/Java通信



我的问题有点类似于这个问题。

我尝试从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

  1. 尝试使jython stdout/stderr无缓冲,传递-u命令行参数
  2. 如果你设置了stderr=PIPE,那么你应该读取它,否则如果子进程填满了对应于它的stderr的OS管道缓冲区,可能会发生死锁。您可以将其重定向到stdout: stderr=STDOUT
  3. 显式设置Python侧缓冲:bufsize=1 (line- buffers)
  4. 使用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()

最新更新