Estoy intentando ejecutar código Python (en vivo desde la consola, no sólo abrir un solo archivo).
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");
Probé este código, pero después de tratar de empujar las siguientes expresiones 1
y 2*2
, no tengo una respuesta (evaluación de mis expresiones).
¿Alguien sabe cuál es el problema?
Su python
código no aparece para imprimir cualquier cosa, y el manejo de múltiples hilos para leer y escribir en otro proceso es un tema complicado; Por suerte, la funcionalidad está integrada. Podrías hacerlo
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();
}
¿Qué salidas
4
y termina. Para una menor integración de Python y Java trivial, me gustaría sugerir fuertemente se mira aquí . En cuanto a su código existente, nunca exit()
pitón y nunca flush()
tu PrintWriter
. Y se escribe en el main
hilo. Y se necesita pasar -i
a pitón, o que no asumirá la entrada estándar es una consola. Cambio del código de
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();
Parece que funciona correctamente.