【问题标题】:Java Processbuilder Stream to Python-ScriptJava Processbuilder 流到 Python 脚本
【发布时间】:2016-02-04 23:02:57
【问题描述】:

我正在尝试做的一个小项目有一个小问题。 我正在尝试使用 Java 程序来调用 Python 脚本。

Java:

ProcessBuilder pb = new ProcessBuilder("python3", "tmp.py");
process = pb.start();

OutputStream stdin = process.getOutputStream();
InputStream stderr = process.getErrorStream();
InputStream stdout = process.getInputStream();

BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));

writer.write("example" + "\n");

String output = reader.readLine();

Python 脚本 tmp.py(示例):

import sys

sys.stdin.readline()
print("Hello World")

它不会终止,似乎是因为 sys.sdin.readline() 没有捕获任何输入,如果我删除这一行,它就会终止就好了。 (stderror 也是空的) 我尝试了不同的方法来解决此问题,但似乎没有任何效果。

我非常感谢任何建议。提前致谢。

(更新:我尝试修改 Java 程序以访问 .jar 文件而不是 Python 脚本,但这里发生了同样的错误。使用 Python 方法 subprocess.Popen() 访问脚本但是工作正常好的。)

【问题讨论】:

  • “非常感谢任何建议” - 不要从 Java 程序调用 Python 脚本?
  • 为什么不使用Jython
  • PS py4j 是让 python 和 java 通信(而不仅仅是调用脚本)py4j.org
  • 我只是在玩进程构建器,python - 脚本只是一个用于试验的小程序,所以我可以理解它是如何工作的。

标签: java python processbuilder


【解决方案1】:

确保使用-u flag 启动无缓冲的python:

强制 stdout 和 stderr 流的二进制层(即 可作为它们的缓冲区属性)被无缓冲。文本 I/O 如果写入控制台,图层仍将被行缓冲,或者 如果重定向到非交互式文件,则为块缓冲。

编辑

我建议您同样检查缓冲。 python unbuffered 是一个常见的,但你可能仍然有一些缓冲。确保刷新 Java 编写器,writer.flush()

【讨论】:

  • 感谢您的建议,但遗憾的是它仍然无法正常工作。我试图修改 Java 程序以访问 .jar 文件而不是 Python 脚本,但发生了同样的错误,所以这可能是 Java 程序中的错误而不是 Python 脚本中的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 2011-11-13
  • 2012-09-04
相关资源
最近更新 更多