python3.x - Java appelle python, le code python s'arrête automatiquement et la raison est introuvable
習慣沉默
習慣沉默 2017-06-28 09:23:50
0
3
974
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

習慣沉默
習慣沉默

répondre à tous(3)
Peter_Zhu

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 :

Process process = Runtime.getRuntime().exec(args);
int exitValue = process.waitFor(); // A
... process.getInputStream() ...   // B

Il doit être traité en premierBgetInputStream() puis getInputStream()再处理AwaitForA

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还是先读errorStreamSi 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

 ? 🎜
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!