J'ai fait pas mal de recherches à ce sujet, et j'ai malheureusement été incapable de trouver une réponse adaptée au problème que je rencontre actuellement. Ma question n'est pas aussi simple que «comment exécuter un script python à partir de Java», pour lequel il existe au moins 10 threads tous contenant la même réponse. Je comprends comment faire ça. Mon problème est le suivant:Exécution d'une interface graphique Python interactive (Matplotlib) à partir de Java Process
Je dispose d'un fichier .py (gui.py
) qui ressemble à ceci:
#!/usr/bin/env python
import matplotlib.pyplot as plt
import copy
import math
import numpy as np
class GUI(object):
...
...
...
if __name__ == '__main__':
GUI.run()
Ce IUG est un terrain matplotlib interactif sur lequel les utilisateurs tirent des choses. Les détails ne sont pas importants - la ligne du bas est le script s'exécute tant que la fenêtre matplotlib est ouverte.
Maintenant, je construis une application Java sur le côté, et il y a un bouton qui, lorsqu'on clique dessus, crée un objet Java Process
qui appellera le script. Je sais à la lecture d'autres messages que PIPE ne peut pas être appelé à partir du Java Runtime, donc j'ai créé un fichier .sh
qui entoure ce script python.
shell.sh
:
#!/bin/sh
python /mypath/to/the/gui.py
Java pour appeler le script shell:
view.getLaunchGuiButton().addActionListener((e) -> {
try {
String[] prcArgs = new String[] { "/mypath/to/shell.sh" };
Process proc = Runtime.getRuntime().exec(prcArgs);
} catch (IOException e1) {
e1.printStackTrace();
}
});
Le script shell est correct - quand je le lance à partir du terminal correctement de tout fonctionne normalement.
Je sais que Java exécute en effet le script shell, et appelle le script python. Il n'y a pas d'erreurs Je n'ai pas mis en place de BufferedReader
car il n'y a rien à lire - j'ai juste besoin de GUI pour ouvrir. Je crois que le problème est qu'une fois le shell exécuté, le "terminal" qui est ouvert par le Runtime
est immédiatement fermé, donc il tue le script python et donc l'interface graphique.
Ma question est, comment puis-je garder le Runtime
de simplement courir et tuer immédiatement le script python (AKA fermant le terminal)?
choses que je l'ai déjà fait:
chmod +x ../../shell.sh
- essayé d'utiliser
nohup /call/python/here &
dans le script shell. N'a pas fonctionné. - Essayé en utilisant
ProcessBuilder
de Java au lieu duRuntime
. Aucune différence.
Des idées? Merci d'avance à tous.