recherche

Maison  >  Questions et réponses  >  le corps du texte

python3.x - Java appelle python, le code python s'arrête automatiquement et la raison est introuvable

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

習慣沉默習慣沉默2750 Il y a quelques jours1090

répondre à tous(3)je répondrai

  • 天蓬老师

    天蓬老师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.

    répondre
    0
  • 巴扎黑

    巴扎黑2017-06-28 09:25:50

    Vous pouvez consulter jython, qui peut exécuter directement du code python en java

    répondre
    0
  • 漂亮男人

    漂亮男人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()再处理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

     ? 🎜

    répondre
    0
  • Annulerrépondre