【问题标题】:Python - communicate with subprocessPython - 与子进程通信
【发布时间】: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


【解决方案1】:

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

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

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

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

我实际上已经从/到 python 完成了这个,加上process.stdout.readline().rstrip() 所以数据是一组行,尽管你仍然需要剥离它们,注意 你可能需要刷新 以便两个进程都注册数据。

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

祝你好运。

【讨论】:

  • 指定要读取的字节数起到了作用。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 2017-07-08
  • 1970-01-01
  • 2017-02-15
  • 2012-05-20
  • 2011-01-09
  • 2013-08-23
相关资源
最近更新 更多