繁体   English   中英

Python - 与子进程通信

[英]Python - communicate with subprocess

我在Win32操作系统上运行Python 2.7,但我希望编写与平台无关的代码。 我正在尝试使用Python与我编写的Java程序实时交互,并且想象管道将是最好的方法。 我的Python脚本将Java作为子进程调用。 从本质上讲,Java是GUI,Python是后端。 (我不想使用Jython或wxPython,因为我只想依赖于每种语言提供的标准库。)尝试在两者之间建立通信非常糟糕。 我可以使用(父)Python脚本向(子)Java类发送消息

process.stdin.write(msg)
process.stdin.flush()

但阅读Java的输出并没有奏效。 我用

process.stdout.read()

但显然,如果没有什么可读的,这将永远封锁。 并且process.communicate()不受限制,因为在子process.communicate()终止之前它不会执行任何操作。 根据我的研究,人们用来解决这个问题的一个常用方法是“使用线程”(尽管有人建议在编写时附加换行符 - 不起作用),但是对于Python和线程新手来说我没有想法看起来如何。 我试过查看标准库的subprocess.py源代码,但这没有帮助。 有没有办法看到stdout是否为空,至少? 如果没有,我该如何做到这一点?

process.stdout.read()
但显然,如果没有什么可读的,这将永远封锁。

好吧,不完全是,它会基本阻塞,而它的读取/等待直到它达到文件关闭时设置的EOF ,绕过这一点的一种方法是说明要读取多少字节process.stdout.read(1) this将读取1个字节并返回如​​果没有字节然后再次它将等待至少一个字节或EOF

你也可以使用python select module,它有一个可选的超时周期,select选择等待这个long或者只返回空值http://docs.python.org/library/select.html
虽然它可能不完全支持在Windows上。

(虽然有人建议在写作时添加换行符 - 但不起作用)

我实际上是从/到python,再加上process.stdout.readline().rstrip()所以数据是一组行虽然你仍然要剥离它们,但是你可能需要刷新为了使两个进程都注册数据。

我确实找到了这个java:如何通过管道(stdin / stdout)读取和写入流程(stdin / stdout) ,这可能对你有帮助。

祝好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM