Ich versuche, Python-Code (live von der Konsole, nicht nur eine einzelne Datei zu öffnen) auszuführen.
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");
Ich habe versucht , diesen Code, aber nach dem Versuch , die folgenden Ausdrücke zu drücken 1
und 2*2
ich erhalte keine Antwort (Bewertung meiner Ausdrücke).
Weiß jemand, was das Problem ist?
Ihr python
Code wird nicht alles zu drucken, und mehrere Threads Umgang mit Lesen und Schreiben zu einem anderen Prozess ist ein heikles Thema; Zum Glück ist die Funktionalität eingebaut. Du könntest es tun
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();
}
welche Ausgänge
4
und wird beendet. Für weniger trivial Python und Java - Integration, würde ich Ihnen dringend aussehen vorschlagen hier . Wie für Ihre vorhandenen Code, die Sie nie exit()
Python und Sie nie flush()
Ihre PrintWriter
. Und Sie schreiben auf den main
Faden. Und Sie müssen passieren -i
zu Python, oder es wird nicht davon ausgehen , stdin ist eine Konsole. Ändern Sie Ihren Code
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();
Scheint richtig zu funktionieren.