gpt4 book ai didi

java - 从 java 作为子进程运行 python 脚本

转载 作者:行者123 更新时间:2023-12-05 02:56:47 25 4
gpt4 key购买 nike

我正在尝试执行 python 代码(从控制台实时执行,而不仅仅是打开单个文件)。

ProcessBuilder builder = new ProcessBuilder("python");
Process process = builder.start();
new Thread(() -> {
try {
process.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
String line;
final BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
// Ignore line, or do something with it
while (true) try {
if ((line = reader.readLine()) == null) break;
else System.out.println(line);
} catch (IOException e) {
e.printStackTrace();
}
}).start();

final PrintWriter writer = new PrintWriter(new OutputStreamWriter(process.getOutputStream()));
writer.println("1");
writer.println("2 * 2");

我试过这段代码,但在尝试推送以下表达式 12*2 后,我没有得到响应(对我的表达式的评估)。

有人知道问题出在哪里吗?

最佳答案

您的 python 代码似乎没有打印任何内容,并且处理多个线程以读取和写入另一个进程是一个棘手的话题;幸运的是,该功能是内置的。你可以做

ProcessBuilder builder = new ProcessBuilder("/usr/bin/env", "python",
"-c", "print(2*2); exit()");
builder.inheritIO();
try {
Process process = builder.start();
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
}

哪些输出

4

并终止。对于不那么琐碎的 Python 和 Java 集成,我强烈建议您查看 here .至于您现有的代码,您永远不会 exit() python,也永远不会 flush() 您的 PrintWriter。然后你在 main 线程上写。并且您需要将 -i 传递给 python,否则它不会假定 stdin 是控制台。将您的代码更改为

ProcessBuilder builder = new ProcessBuilder("/usr/bin/env", "python", "-i");
Process process = builder.start();

new Thread(() -> {
String line;
final BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
// Ignore line, or do something with it
while (true)
try {
if ((line = reader.readLine()) == null)
break;
else
System.out.println(line);
} catch (IOException e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
final PrintWriter writer = new PrintWriter(
new OutputStreamWriter(process.getOutputStream()));
writer.println("1");
writer.println("2 * 2");
writer.println("exit()");
writer.flush();
}).start();

似乎工作正常。

关于java - 从 java 作为子进程运行 python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60176528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com