2017-06-30 3 views
1

Ich habe eine ganze Reihe von Nachforschungen darüber angestellt und konnte leider keine passende Antwort für das Problem finden, das ich gerade habe.Ausführen einer interaktiven Python-GUI (Matplotlib) aus dem Java-Prozess

Meine Frage ist nicht so einfach wie "Wie führe ich ein Python-Skript von Java," zu dem es mindestens 10 Threads gibt, die alle die gleiche Antwort enthalten. Ich verstehe, wie man das macht. Mein Problem ist, wie folgt:

Ich habe eine Py-Datei (gui.py), die etwa wie folgt aussieht:

#!/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() 

Diese gui ist ein interaktives matplotlib Grundstück, auf dem Benutzer Sachen zeichnen. Details sind nicht wichtig - unter dem Strich läuft das Skript so lange, wie das Matplotlib-Fenster geöffnet ist.

Jetzt baue ich eine Java-App auf der Seite, und es gibt eine Schaltfläche, die beim Klicken erstellt ein Java Process Objekt, das Skript aufrufen wird. Ich weiß aus dem Lesen anderer Beiträge, dass PIPE nicht von der Java-Laufzeit aufgerufen werden kann, also habe ich eine .sh-Datei erstellt, die dieses Python-Skript umschließt.

shell.sh:

#!/bin/sh 
python /mypath/to/the/gui.py 

Die Java das Shell-Skript aufrufen:

view.getLaunchGuiButton().addActionListener((e) -> { 

      try { 
       String[] prcArgs = new String[] { "/mypath/to/shell.sh" }; 
       Process proc = Runtime.getRuntime().exec(prcArgs); 

      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 
     }); 

Das Shell-Skript ist richtig - wenn ich es vom Terminal richtig funktioniert alles normal laufen.

Ich weiß, dass Java tatsächlich das Shell-Skript ausführt und das Python-Skript aufruft. Es gibt keine Fehler. Ich habe keine BufferedReader eingerichtet, weil es nichts zu lesen gibt - ich muss nur GUI zu öffnen. Ich glaube, dass das Problem ist, dass, sobald die Shell ausgeführt wird, das "Terminal" sozusagen, das von der Runtime geöffnet wird, sofort geschlossen ist, daher tötet es das Python-Skript und daher die GUI.

Meine Frage ist, wie behalte ich die Runtime einfach laufen und sofort das Python-Skript (AKA das Terminal zu beenden) zu töten?

Dinge habe ich bereits getan:

  • chmod +x ../../shell.sh
  • Versuchte nohup /call/python/here & in der Shell-Skript. Hat nicht funktioniert.
  • Versucht mit Javas ProcessBuilder anstelle der Runtime. Kein Unterschied.

Irgendwelche Ideen? Vielen Dank im Voraus.

Antwort

0
  1. Vom Java-Knopf listner I xterm exec-ed:

    try { 
         Process p = Runtime.getRuntime().exec("xterm"); 
         Thread.sleep(1500); 
    
        } catch (IOException e1) { 
         e1.printStackTrace(); 
        } 
    
  2. In ~/.bashrc habe ich mein Kommando, das mit GUI mein Python-Skript startet:

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

    Die Python-GUI zeigt und läuft weiter ...

Die Idee, einen Befehl auf xterm Start ausgeführt wird, für alle xterm aus diesem Thread bezogen ist: How to run a command on the startup of an xterm?

Die Thread.sleep ist nur für einige Zeit die xterm Halteausgabe von kurzen Befehl, um zu sehen, aber die xterm bleibt läuft in interaktiver Modus

Verwandte Themen