【发布时间】:2021-07-27 10:48:11
【问题描述】:
我正在尝试制作一个运行 python 程序的成熟 Java 程序。 python程序如下:
print('Enter two numbers')
a = int(input())
b = int(input())
c = a + b
print(c)
如果我执行这段代码,终端看起来像这样:
Enter two numbers
5
3
8
现在,从 Java 执行此代码时,我想要相同的输出。这是我的 Java 代码:
import java.io.*;
class RunPython {
public static void main(String[] args) throws IOException {
String program = "print('Enter two numbers')\na = int(input())\nb = int(input())\nc = a + b\nprint(a)\nprint(b)\nprint(c)";
FileWriter fileWriter = new FileWriter("testjava.py");
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
bufferedWriter.write(program);
bufferedWriter.close();
Process process = Runtime.getRuntime().exec("python testjava.py");
InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream());
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(process.getOutputStream());
InputStreamReader read = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(read);
String output;
while (process.isAlive()) {
while (!bufferedReader.ready());
System.out.println(bufferedReader.ready());
while (!(output = bufferedReader.readLine()).isEmpty()) {
System.out.println(output);
}
bufferedReader.close();
if (process.isAlive()) {
outputStreamWriter.write(in.readLine());
}
}
}
}
但是在运行这个程序时,只显示第一行,并采用第一个输入。之后,程序没有响应。 我犯了什么错误?解决办法是什么?
【问题讨论】:
-
您是否使用调试器单步执行了您的程序?
-
尝试在testjava.py中编写Python代码,不使用String Program执行
-
如果要避免 IO 阻塞副作用,您需要以与“手动”输入相同的方式写入流程输入流,并让 stdout 和 stderr 能够异步响应。如果你以正确的方式安排它,你的问题应该会消失
-
您是否曾研究过 Jython 的解决方案?如果不是,您可以使用
Process p = new ProcessBuilder("python", "myScript.py", "firstargument").start();之类的东西将参数从java 传递到python 脚本。但无论如何,Jython 都可以以更清晰的方式做到这两点。