Java Processbuilder 流式传输到 Python-脚本
Java Processbuilder Stream to Python-Script
我在尝试做一个小项目时遇到了一个小问题。
我正在尝试使用 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() 访问脚本但是工作正常。)
确保你开始 python 无缓冲 -u
flag:
Force the binary layer of the stdout and stderr streams (which is
available as their buffer attribute) to be unbuffered. The text I/O
layer will still be line-buffered if writing to the console, or
block-buffered if redirected to a non-interactive file.
编辑
我建议还是检查缓冲。 python unbuffered 是一个常见的,但你可能还有一些缓冲。确保冲洗 java 作家,writer.flush()
.
我在尝试做一个小项目时遇到了一个小问题。 我正在尝试使用 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() 访问脚本但是工作正常。)
确保你开始 python 无缓冲 -u
flag:
Force the binary layer of the stdout and stderr streams (which is available as their buffer attribute) to be unbuffered. The text I/O layer will still be line-buffered if writing to the console, or block-buffered if redirected to a non-interactive file.
编辑
我建议还是检查缓冲。 python unbuffered 是一个常见的,但你可能还有一些缓冲。确保冲洗 java 作家,writer.flush()
.