2017-06-30 5 views
1

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 du Runtime. Aucune différence.

Des idées? Merci d'avance à tous.

Répondre

0
  1. à partir du bouton Java listner I exec xterm-ed:

    try { 
         Process p = Runtime.getRuntime().exec("xterm"); 
         Thread.sleep(1500); 
    
        } catch (IOException e1) { 
         e1.printStackTrace(); 
        } 
    
  2. En ~/.bashrc j'ai ajouté ma commande qui commence mon script Python avec une interface graphique:

    if [[ -z "$XTERM_ONCE" ]] 
    then 
        export XTERM_ONCE=$(date) 
        cd /home/qswadey/path/to/py/script/ 
        python3 pyscript_with_GUI.py 
    fi 
    

    L'interface Python apparaît et continue ...

L'idée d'exécuter une commande au démarrage du xterm, pour tous xterm provient de ce fil: How to run a command on the startup of an xterm?

Le Thread.sleep est juste pour tenir le xterm pendant un certain temps pour voir la sortie de commande courte, mais le xterm reste en cours d'exécution dans mode interactif