Aggiornamento degli script jsl utilizzando Python a JMP 18Abbiamo script jsl che chiamano script Python che ora desidero aggiornare per la nuova funzionalità Python di JMP 18.
Fino a JMP 18, facevamo qualcosa del genere per preparare la connessione Python:
// 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")
]\"
);Dato che Python Init() è ora deprecato, mi chiedo a) se ho bisogno adesso di inizializzare la connessione Python prima di usare python send(), send(), .... b) se sì, come lo farei usando immagino usando Python Connect ()
La mia teoria attuale è che dovrei sostituire l'elemento sopra con:
Python connect();
Python submit (
...blablabla...
);
ma la documentazione e gli esempi sono un po' scarsi a riguardo.
Automazione e scriptingRi: Aggiornamento degli script jsl utilizzando Python a JMP 18Né Python Init() né Python Connect() sono necessari per "inizializzare" l'ambiente Python in JMP 18. Poiché Python è integrato e installato con JMP, è immediatamente disponibile. Questo è il motivo per cui Python Init() è stato deprecato. Python Connect esiste ancora per supportare l'uso di un oggetto di connessione.
conn = Python Connetti();
conn << Ottieni(dt);
conn << Submit("\[ ... codice python ... ]\");
Se non hai bisogno dell'oggetto connessione non hai bisogno né di Python Init() né di Python Connect(). puoi semplicemente fare:
Python Invia(
...il mio codice qui...
);
Re: Aggiornamento degli script JSL utilizzando Python a JMP 18Penso che il mio errore di pensiero sia stato pensare che avessi bisogno di una sorta di inizializzazione perché ho ricevuto errori che indicavano che i pacchetti che volevo non erano stati trovati.
Ma dopo aver eseguito jmputils.jpip('list'), vedo che devo prima installarli (davo per scontato che fossero preinstallati pacchetti standard come numpy o pandas).
Re: Aggiornamento degli script JSL utilizzando Python a JMP 18JMP 18.0 viene fornito solo con la distribuzione standard di Python.org, ad eccezione di alcuni pacchetti che potrebbero causare conflitti con l'esecuzione di Python da JMP. Si tratta principalmente di tkinter e venv. Qualsiasi pacchetto esterno deve essere installato dall'utente. Ci sono un paio di motivi. Tutto ciò che JMP fornisce, che sia una libreria, un pacchetto o un componente open source di terze parti, deve superare diversi processi di approvazione interna, inclusa la revisione da parte del nostro ufficio legale. Ciò significa anche che monitoriamo attentamente il pacchetto per individuare eventuali correzioni di bug e problemi di sicurezza. Infine, esistono incompatibilità tra i pacchetti, quindi la scelta di una versione del pacchetto potrebbe comportare un conflitto con un pacchetto di cui si ha bisogno. La scelta dei pacchetti di cui si ha bisogno al di fuori di quelli forniti nella libreria standard è nelle mani dell'utente.
Altri elementi da tenere a mente nel porting degli script Python JMP 14-17.
- Python Term(); non è necessario poiché l'ambiente scompare solo quando si chiude JMP.
- 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() veniva utilizzato per impostare alcune opzioni con matplotlib. Sebbene non sia stato rimosso nella versione 18.0, la sua unica funzione ora è quella di visualizzare un avviso "deprecato" nel log.
- Python Is Connected(); è deprecato perché restituisce sempre true. L'ambiente Python è sempre disponibile.
Un ultimo problema da notare. Abbiamo scoperto un problema con mx = Python Get( numpy.ndarray ); Se l'array NumPy era maggiore di 2 dimensioni, si otteneva un risultato, ma si perdevano dimensioni maggiori di due. C'era anche un problema se il layout di memoria dell'array NumPy era Column-Major (stile Fortran) anziché Row-Major (stile C). Ciò poteva causare un crash di JMP. Questo problema è stato risolto. La correzione sarà presente in JMP 18.1. Se si verifica questo problema in JMP 18.0, assicurarsi che i dati NumPy siano in formato Row-Major e che "Get" solo ndarray a 1 o 2 dimensioni. Quando si usa Get() su un ndarray, questo tenta di creare una matrice JSL che supporta solo 1 o 2 dimensioni. Questo bug è specifico di JMP 18.0, poiché JMP 14-17 trasferiva i dati attraverso il file system come file binario temporaneo di valori double. Sebbene 14-17 potrebbero perdere dati se il numero di dimensioni è maggiore di 2.