【发布时间】:2012-07-07 11:10:35
【问题描述】:
我在 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() 是禁区,因为在子进程终止之前它不会做任何事情。根据我的研究,人们用来解决这个问题的常用方法是“使用线程”(尽管有人建议在编写时添加换行符——没有用),但是对于 Python 和线程来说,我没有想法会是什么样子。我试过查看标准库的subprocess.py 源代码,但这并没有帮助。至少有没有办法查看标准输出是否为空?如果没有,我该如何完成?
【问题讨论】:
-
一般而言,您必须并行排空所有流,否则会遇到问题(假设您正在等待 stdout,但进程已将 stderr 的缓冲区写满并且正在等待有人从中读取)。我知道阅读没有超时,所以这无济于事。你的问题到底是什么?无论如何,阻塞直到您从 java 获得预期的输出似乎是通常想要的行为。
-
我可以阻止;事实上,这正是我想要的。我希望 Python 阻止 直到 Java 说什么。我的问题是
process.communicate()阻塞直到程序终止,而process.stdout.read()永远阻塞。 Java一说什么,我就想让Python知道,但我不知道该怎么做。
标签: java python ipc pipe block