Aktualisieren von JSL-Skripten mit Python auf JMP 18Wir haben JSL-Skripte, die Python-Skripte aufrufen, die ich jetzt für die neue Python-Funktionalität von JMP 18 aktualisieren möchte.
Bis JMP 18 haben wir ungefähr Folgendes gemacht, um die Python-Verbindung vorzubereiten:
// Python setup
Python Init( Debug Print Statements( "TRUE" ), Init Trace("TRUE"), Debug Print Output("TRUE") );
Python Submit(
"\[
import numpy as _JMPnp
import scipy as _JMPsp
import pandas as _JMPpd
import sqlite3 as _JMPsq
if PY_DEBUG_OUTPUT:
print("Python Imports OK")
]\"
);Da Python Init() mittlerweile veraltet ist, frage ich mich, a) ob ich die Python-Verbindung überhaupt noch initialisieren muss, bevor ich Python send(), submit() usw. verwende. b) wenn ja, wie ich das machen würde, vermutlich mit Python connect().
Meine derzeitige Theorie ist, dass ich das obige Element durch Folgendes ersetzen müsste:
Python connect();
Python submit (
...blablabla...
);
Die Dokumentation und Beispiele hierzu sind jedoch etwas spärlich.
Automatisierung und SkriptingBetreff: Aktualisieren von JSL-Skripten mit Python auf JMP 18Weder Python Init() noch Python Connect() sind erforderlich, um die Python-Umgebung in JMP 18 zu „initialisieren“. Da Python integriert und mit JMP installiert ist, ist es sofort verfügbar. Aus diesem Grund wurde Python Init() verworfen. Python Connect ist weiterhin vorhanden, um die Verwendung eines Verbindungsobjekts zu unterstützen.
conn = Python Connect();
conn << Get( dt );
conn << Senden("\[ ... Python-Code ... ]\");
Wenn Sie das Verbindungsobjekt nicht benötigen, brauchen Sie weder Python Init() noch Python Connect(). Sie können einfach Folgendes tun:
Python-Senden(
... mein Code hier ...
);
Betreff: Aktualisieren von JSL-Skripten mit Python auf JMP 18Ich glaube, mein Denkfehler bestand darin, dass ich eine Art Initialisierung benötigte, da ich Fehlermeldungen erhielt, dass die gewünschten Pakete nicht gefunden wurden.
Aber nachdem ich jmputils.jpip('list') ausgeführt habe, sehe ich, dass ich sie zuerst installieren muss (ich bin davon ausgegangen, dass Standardpakete wie Numpy oder Pandas vorinstalliert wären).
Betreff: Aktualisieren von JSL-Skripten mit Python auf JMP 18JMP 18.0 wird nur mit der Standard-Python.org-Distribution ausgeliefert, abgesehen von einigen Paketen, die Konflikte mit Python in JMP verursachen können. Dies sind in erster Linie tkinter und venv. Alle externen Pakete müssen vom Benutzer installiert werden. Dafür gibt es mehrere Gründe. Alle von JMP ausgelieferten Drittanbieter-Bibliotheken, -Pakete oder Open-Source-Komponenten durchlaufen mehrere interne Genehmigungsverfahren, darunter auch eine Prüfung durch unsere Rechtsabteilung. Das bedeutet auch, dass wir das Paket auf Fehlerbehebungen und Sicherheitslücken überwachen. Schließlich gibt es Paketinkompatibilitäten, sodass unsere Auswahl einer Paketversion Konflikte mit einem von Ihnen benötigten Paket verursachen kann. Sie haben die Wahl, die Pakete, die Sie benötigen, außerhalb der Standardbibliothek auszuwählen.
Weitere zu beachtende Punkte beim Portieren von JMP 14-17-Python-Skripten.
- Python Term(); ist unnötig, da die Umgebung nur verschwindet, wenn Sie JMP beenden.
- Python Get Graphics(); was removed from JMP 18. This single function caused a dependency on matplotlib. And the goal is to prevent JMP from requiring any external packages for basic functionality. It is easy enough to replicate the same functionality in your own scripts. The Scripting Index example for 'Python Get Graphics();' contains a complete example of the replacement code. Simply save the figure to an image file and open the image in a JMP window.
Python Submit("\[
...
# save image to location of your choosing
plt.savefig('/tmp/get_graphics_img.png')
]\");
// plot = Python Get Graphics( png ); // DEPRECATED
plot = Open( "/tmp/get_graphics_img.png", png );
pngJMP = New Window( "Plot", Picture Box( plot ) );
Python Submit( "plt.close()" );
rc = Delete File( "/tmp/get_graphics_img.png" );
- Python Control() wurde zum Setzen einiger Optionen mit Matplotlib verwendet. Obwohl es in 18.0 nicht entfernt wurde, besteht seine einzige Funktion nun darin, eine „veraltete“ Warnung in das Protokoll einzugeben.
- Python Is Connected(); ist veraltet, da es immer „true“ zurückgibt. Die Python-Umgebung ist immer verfügbar.
Ein letztes zu beachtendes Problem. Wir haben ein Problem mit „mx = Python Get(numpy.ndarray);“ entdeckt. Wenn das NumPy-Array mehr als 2 Dimensionen hatte, erhielten Sie ein Ergebnis, aber es gingen Dimensionen verloren, die mehr als zwei Dimensionen hatten. Es gab auch ein Problem, wenn das Speicherlayout des NumPy-Arrays Column-Major (Fortran-Stil) statt Row-Major (C-Stil) war. Dies konnte zu einem JMP-Absturz führen. Dieses Problem wurde behoben. Der Fix wird in JMP 18.1 enthalten sein. Wenn dieses Problem in JMP 18.0 auftritt, stellen Sie sicher, dass Ihre NumPy-Daten im Row-Major-Format vorliegen und „holen“ Sie nur 1- oder 2-dimensionale ndarrays. Wenn Sie ein ndarray abrufen, versucht es, eine JSL-Matrix zu erstellen, die nur 1 oder 2 Dimensionen unterstützt. Dieser Fehler tritt spezifisch in JMP 18.0 auf, da JMP 14-17 die Daten als temporäre Binärdatei mit Doubles durch das Dateisystem übertragen hat. Allerdings können bei 14-17 Daten verloren gehen, wenn die Anzahl der Dimensionen größer als 2 ist.