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 derRuntime
. Kein Unterschied.
Irgendwelche Ideen? Vielen Dank im Voraus.