2012-07-07 113 views
3

我在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源,但没有帮助。有没有办法查看标准输出是否为空,至少?如果没有,我该如何做到这一点?

+0

一般而言,您**有**并行排除所有流,否则会遇到问题(例如,您正在等待stdout,但进程已写入stderr的缓冲区已满并正在等待有人从中读取它)。阅读我没有超时的意识,所以这不会有帮助。你的问题到底是什么?阻塞,直到你得到java的预期输出,无论如何,看起来像通常的想要的行为。 – Voo 2012-07-07 02:14:43

+0

我很好,阻止;事实上,这正是我想要的。我希望Python阻止_until Java说something_。我的问题是'过程。沟通()'阻塞直到程序终止,并且'process.stdout.read()'永远阻塞。只要Java说了什么,我想Python知道,但我不知道如何做到这一点。 – nuju 2012-07-07 03:09:28

回答

2

process.stdout.read()
但显然这永远块,如果没有什么阅读。

以及不完全,而其无论是读/等待它基本上会阻塞,直到它击中EOF其中,当文件关闭设置,来规避这个方法是说明你要多少字节读取process.stdout.read(1)这将读取1个字节并返回,如果没有字节,则再次等待至少一个字节或EOF

您也可以使用Python select模块,该模块有一个可选的超时时间,其中该选择等待或长或简单地用空值http://docs.python.org/library/select.html
返回尽管它可能不完全支持Windows。

(虽然有人建议追加写入时换行符 - 没有工作)

其实我已经做到了这一点自/至蟒虽然,加上process.stdout.readline().rstrip()所以数据是一组(s)尽管你仍然必须去掉它们,应该注意到你可能必须冲洗以便两个进程都注册数据。

我的确找到这个可以帮到你的java: how to both read and write to & from process thru pipe (stdin/stdout)

祝你好运。

+1

指定要读取的字节数有窍门。谢谢! – nuju 2012-07-07 03:29:28