我在Win32操作系统上运行Python 2.7,但我希望编写与平台无关的代码。我正尝试使用Python与我编写的Java程序实时交互,并且认为管道是实现此目的的最佳方式。我的Python脚本将Java作为子进程调用。从本质上讲,Java是GUI,Python是后端。 (我不想使用Jython或wxPython,因为我只想依赖每种语言提供的标准库。)尝试设置两者之间的通信非常可怕。我可以使用Python - 与子进程通信
process.stdin.write(msg)
process.stdin.flush()
从(父级)Python脚本发送消息到(孩子)Java类,但是读取Java的输出不起作用。我用
process.stdout.read()
但是,如果没有什么可读的话,这显然会永远阻止。并且process.communicate()
是关闭的,因为它在子进程终止之前不会执行任何操作。根据我的研究,人们用来解决这个问题的一种常用方法是“使用线程”(尽管有人建议在编写时添加一个换行符 - 没有用),但是对于Python和线程的新手来说,我没有想法看起来如何。我试过看标准库的subprocess.py
源,但没有帮助。有没有办法查看标准输出是否为空,至少?如果没有,我该如何做到这一点?
一般而言,您**有**并行排除所有流,否则会遇到问题(例如,您正在等待stdout,但进程已写入stderr的缓冲区已满并正在等待有人从中读取它)。阅读我没有超时的意识,所以这不会有帮助。你的问题到底是什么?阻塞,直到你得到java的预期输出,无论如何,看起来像通常的想要的行为。 – Voo 2012-07-07 02:14:43
我很好,阻止;事实上,这正是我想要的。我希望Python阻止_until Java说something_。我的问题是'过程。沟通()'阻塞直到程序终止,并且'process.stdout.read()'永远阻塞。只要Java说了什么,我想Python知道,但我不知道如何做到这一点。 – nuju 2012-07-07 03:09:28