Je suis en train d'exécuter du code python (en direct à partir de la console, ne pas ouvrir un seul fichier).
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");
J'ai essayé ce code, mais après avoir essayé de pousser les expressions suivantes 1
et 2*2
, je ne reçois pas de réponse (évaluation de mes expressions).
Est-ce que quelqu'un sait ce que la question est?
Votre python
code ne semble pas imprimer quoi que ce soit, et gérer plusieurs threads de lire et d' écrire à un autre processus est un sujet délicat; intégré heureusement, la fonctionnalité est. Vous pourriez faire
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();
}
Quels sont les résultats
4
et se termine. Pour moins trivial intégration Python et Java, je vous suggère fortement regardez ici . En ce qui concerne votre code existant, vous ne exit()
python et vous ne flush()
vous PrintWriter
. Et vous écrivez sur le main
fil. Et vous devez passer -i
à python, ou il ne sera pas hypothétiquement stdin une console. Changer votre 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();
Semble fonctionner correctement.