3

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

4

1 回答 1

2

process.stdout.read()
但如果没有什么可读的,显然这会永远阻塞。

不完全是,它基本上会在它读取/等待直到EOF文件关闭时设置的命中时阻塞,避免这种情况的一种方法是说明您要读取多少字节, process.stdout.read(1)这将读取 1 个字节,如果没有则返回byte 然后它会等到至少有一个 byte 或EOF.

您也可以使用 pythonselect模块,它有一个可选的超时时间,其中 select 等待这么长时间,或者只是返回空值http://docs.python.org/library/select.html
虽然它可能不完全支持 Windows。

(尽管有人建议在写作时添加换行符——没用)

我实际上已经从/到 python 完成了此操作,再加上process.stdout.readline().rstrip()数据是一组行,尽管您仍然必须剥离它们,但请注意,您可能必须刷新才能使两个进程都注册数据。

我确实找到了这个java: how to read and write to & from process thru pipe (stdin/stdout)这可能会对你有所帮助。

祝你好运。

于 2012-07-07T02:35:08.623 回答