Maison > Questions et réponses > le corps du texte
String[] args = {"python3", pythonFile};
Process process = Runtime.getRuntime().exec(args);
int exitValue = process.waitFor();
BufferedInputStream in = new BufferedInputStream(process.getInputStream());
BufferedInputStream err = new BufferedInputStream(process.getErrorStream());
BufferedReader inBr = new BufferedReader(new InputStreamReader(in));
BufferedReader errBr = new BufferedReader(new InputStreamReader(err));
String lineStr;
while ((lineStr = inBr.readLine()) != null) {
logger.info(lineStr);
}
while ((lineStr = errBr.readLine()) != null) {
logger.error(lineStr);
}
inBr.close();
errBr.close();
in.close();
err.close();
Appelez le code python, le temps d'exécution est relativement long, il est estimé à plusieurs heures, environ cinq ou six heures. Si vous exécutez la commande Python directement dans le shell seul, il n'y aura aucun problème ; cependant, si vous utilisez Java pour appeler python de cette manière, il y aura un problème : après un certain temps, python n'aura aucune sortie. Ma façon de déterminer si Python est en cours d'exécution consiste à écrire des fichiers en continu et, de temps en temps, à écrire des fichiers sur le système de fichiers. Si vous entrez la commande python directement dans le shell, c'est normal. Java appelle python Après plus de trois heures, aucun fichier n'est généré, mais en utilisant htop pour vérifier, le thread est toujours là. L'environnement d'exécution est Ubuntu
天蓬老师2017-06-28 09:25:50
Concernant l'interaction entre java et python, je peux vous donner une idée, juste à titre de référence. J'ai déjà réalisé un projet, en utilisant socket, le terminal mobile est un script Java, le serveur est Python, puis Java envoie des chaînes au serveur Python pour interaction. Vous pouvez l'essayer.
巴扎黑2017-06-28 09:25:50
Vous pouvez consulter jython, qui peut exécuter directement du code python en java
漂亮男人2017-06-28 09:25:50
Il y a un problème avec ce code :
Process process = Runtime.getRuntime().exec(args);
int exitValue = process.waitFor(); // A
... process.getInputStream() ... // B
Il doit être traité en premierBgetInputStream()
puis getInputStream()
再处理AwaitFor
A
waitFor
, car Java communique avec le programme qu'il appelle via un tube sinon en lisant le. pipe à temps, le programme appelé peut se bloquer lors de l'écriture sur la sortie standard. Donc, l'ordre correct est :
Process process = Runtime.getRuntime().exec(args);
... process.getInputStream() ... // B
... process.getErrorStream() ... // C
int exitValue = process.waitFor(); // A
Laissez une autre question :
inputStream
还是先读errorStream
Si le programme appelé écrit d'abord sur stderr puis sur stdout, ne bloquera-t-il pas quand même ? Devriez-vous d’abord lire Java