(Benutzerdefinierte) Python-GUI, ausgeführt in JMPHallo zusammen,
Ich habe ein benutzerdefiniertes Python-Paket, das GUIs zum Abrufen der Benutzereingabe verwendet. Ich möchte dieses Paket jetzt innerhalb von JMP18 ausführen.
PY_SCRIPT = "
from mydummy.util import jmp
from mydummy.request import this_data
df = this_data().GUI()
jmp_source = jmp.df2jmp(df, 'MY DT')
";
EXECUTE = Python Execute({}, {jmp_source}, PY_SCRIPT);
If(EXECUTE == 0,
DT = Eval(Parse(jmp_source));
,
DT = New Table();
);Im Prinzip funktioniert dieses Skript. Es erstellt die GUI, verarbeitet die Daten in Python, konvertiert sie in ein JMP-Tabellenskript und von da an kann ich JSL wie gewohnt für die Datenanalyse/Grafiken verwenden.
Allerdings friert Python Execute (sowie Run Programm) immer alles in JMP ein. Wenn also die GUI geöffnet ist und der Python-Code ausgeführt wird, kann ich in JMP nichts mehr tun. Gibt es eine Möglichkeit, eine neue Instanz der Instanz „~JMP\JMPPRO\18\jmp_python.exe“ zu starten?
Ich habe auch ein Python-Skript mit subprocess.Popen ausprobiert. Wenn ich auf die Rückgabe warte, habe ich die gleichen Probleme.
Meine GUI benötigt den Hauptthread, daher ist auch Threading nicht möglich – irgendwie muss ich eine neue Instanz von ~jmp_python.exe erstellen, oder JSL kann damit umgehen.
Irgendwelche Vorschläge? Ist das möglich?
Danke
Automatisierung und SkriptingBetreff: (Benutzerdefinierte) Python-GUI in JMP ausgeführtDie JMP Python-Integration läuft im Hauptthread, weshalb Ihre Benutzeroberfläche übernimmt und JMP blockiert. Sie können versuchen, einen Unterprozess zu verwenden, um eine über die Befehlszeile gestartete Kopie von jmp_python.exe anzugeben und zu starten. Aus diesem Grund existieren die Variablen jmp.PYTHON_EXE und jmp.PYTHONW_EXE. (Ich glaube, PYTHONW_EXE ist möglicherweise 19+). Aber vom Unterprozess aus können Sie das JMP- Paket nicht verwenden.
Andere Probleme, die beim Ausführen einer Python-GUI auftreten können, sind, dass sie die Hauptschleife übernimmt und beim Schließen des letzten Dialogs JMP abstürzen kann, da das Verlassen der Python-GUI-Hauptschleife Menüelemente, Fenstergriffe usw., von denen JMP abhängt, zerstören kann. Dies ist heikel, da Sie versuchen, über Python ein anderes UI-Toolkit zu laden, das in eine GUI-Anwendung eingebettet ist ...
Ich glaube, dass dies derzeit am besten möglich ist, indem man die GUI mit JSL-erstellten Dialogen und Fenstern schreibt, die von Python aus mit jmp.run_jsl aufgerufen werden können. Dies ist im Beispielskript pyDigest.py möglich, in dem ein JSL-Verzeichniswähler verwendet wird, um den Pfad zu einem Verzeichnis abzurufen.
jmp.run_jsl('''
localPath = Pick Directory("Choose Directory to checksum");
// Pick Directory on windows returns a leading / use Convert File Path()
If( Host is("Windows"),
localpath = Convert File Path( localPath, windows )
);
Die Verwendung der Dialog- und Fensterfunktionen von JMP ist kompatibel. Wir untersuchen das externe UI-Problem.
Betreff: (Benutzerdefinierte) Python-GUI in JMP ausgeführtRunProgram friert JMP ein, da es ohne eine ReadFunction die gesamte Ausgabe sammelt, bevor es zurückkehrt. Es kann auch mit einer ReadFunction verwendet werden, die aufgerufen wird, wenn JMP im Leerlauf ist oder während einer Wartezeit (0), sodass JMP andere Aufgaben ausführen kann, solange etwas Leerlaufzeit besteht. Erstellen Sie ein Video in JMP mit FFmpeg bietet ein Beispiel für eine einfache ReadFunction, die aus dem externen Programm liest und das Gelesene in das JMP-Protokoll schreibt.