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
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.
Vous pouvez consulter jython, qui peut exécuter directement du code python en java
Il y a un problème avec ce code :
Il doit être traité en premierB
getInputStream()
puisgetInputStream()
再处理AwaitFor
AwaitFor
, 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 : 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