Esecuzione di un exe Python da Esegui programma()Ho un eseguibile Python (quindi io o altri non abbiamo bisogno di Python installato sul PC) che può analizzare alcuni dati...
Vorrei chiamarlo ed eseguirlo da JMP, ma non sono sicuro del modo migliore poiché vorrei poter fornire variabili a questo exe Python da JMP e ottenere il ritorno.
L'ho fatto con successo utilizzando i comandi Python integrati, ma mai con un file exe Python stand-alone. Una delle variabili che avrei bisogno di inserire è una tabella dati. Attualmente dovrei fare in modo che JMP salvi la tabella come .csv in una posizione temporanea, quindi questo exe Python può eseguire e modificare quel .csv ... quindi JMP può aprire il CSV aggiornato (non ho quel flusso codificato in JSL poiché ritengo che debba esserci un modo migliore)
qualche idea? Ho un'esperienza minima con Run Command() quindi qualsiasi suggerimento iniziale sarà apprezzato 
Grazie!
Modellazione statistica avanzataAutomazione e scriptingRicerche sui consumatori e sul mercatoAccesso ai datiPersonalizzazione di massaRi: Esecuzione di un exe Python da Esegui programma()C'è un esempio funzionante in Realizza un video in JMP con FFmpeg . Utilizza l'eseguibile FFmpeg, non un eseguibile Python, ma mostra sia la lettura da stdout che la scrittura su stdin. La funzione di lettura si limita a inviare eco al registro JMP, ma puoi bufferizzare il testo e fare qualcos'altro se lo desideri. La funzione di scrittura trasmette le immagini su FFmpeg per la codifica, una alla volta.
Con FFmpeg, è utile avere l'eco in tempo reale nel registro JMP mentre le immagini vengono passate a FFmpeg; mi permette di vedere se qualcosa non va nel mezzo di un lungo processo. Se hai un processo più breve, con un singolo output (possibilmente di grandi dimensioni) alla fine, troverai più conveniente utilizzare readfunction("text" o "blob") che consente a JMP di bufferizzare lo stdout in una singola stringa che è restituito. Inoltre, non è necessario attendere (vedi fine dell'esempio) che RunProgram termini per ottenere i risultati. D'altro canto, l'utilizzo di readfunction(function(...)) consente a JMP di avviare l'elaborazione dell'output mentre viene generato.
Se il programma Python restituisce un CSV su stdout, readfunction dovrebbe utilizzare un blob per due motivi (anche se i dati dovrebbero essere ASCII a 7 bit): un blob può essere più grande di 2 GB ma una stringa JSL no e puoi caricare la macchia come dt = open(variabileblob, "csv") . Inserisci un'intestazione nel CSV ed è utile anche se devi restituire solo alcuni valori denominati come una tabella con una singola riga.
C'è qualche esempio di codice Python sepolto Beowulf, Newton e il signor Hanson che legge i parametri della riga di comando: cerca getopt --, ma probabilmente puoi trovare esempi più facili da usare altrove. In questo esempio, JMP utilizza plink (da putty) per eseguire Python su un computer remoto e utilizza un disco NFS sulla rete per condividere i dati.
Ri: Esecuzione di un exe Python da Esegui programma()Sì, direi che vale la pena provarlo. Ho eseguito una funzione simile di scrittura/lettura del flusso su Unix per passare da un dataframe Pandas molto grande a una tabella Postgres ed è incredibilmente veloce. Non so come sia l'implementazione di JMP, ma forse puoi scrivere l'intera tabella sullo stdin in una volta sola? Come un gigantesco elenco di elenchi forse...
Per riferimento, ho testato il metodo Python su un dataframe Pandas di circa 3 GB e il completamento ha richiesto meno di 10 secondi. Il metodo è questo:
def psql_insert_copy(table, conn, keys, data_iter):
"""
Parameters
----------
table : pandas.io.sql.SQLTable
conn : sqlalchemy.engine.Engine or sqlalchemy.engine.Connection
keys : list of str
Column names
data_iter : Iterable that iterates the values to be inserted
"""
# gets a DBAPI connection that can provide a cursor
dbapi_conn = conn.connection
with dbapi_conn.cursor() as cur:
s_buf = StringIO()
writer = csv.writer(s_buf)
writer.writerows(data_iter)
s_buf.seek(0)
columns = ', '.join('"{}"'.format(k) for k in keys)
if table.schema:
table_name = '{}.{}'.format(table.schema, table.name)
else:
table_name = table.name
sql = 'COPY {} ({}) FROM STDIN WITH CSV'.format(
table_name, columns)
cur.copy_expert(sql=sql, file=s_buf)
df.to_sql('example', schema='demo', con=DL.engine, method=psql_insert_copy)Che ho trovato su qualche sito da qualche parte secoli fa (non sono così intelligente
). Utilizza un iteratore di dati e lo scrive riga per riga nello stdin del cursore postgres, ma è comunque estremamente veloce.
Ri: Esecuzione di un exe Python da Esegui programma()Il vantaggio di CSV o Panda è che non è necessario analizzare l'output di Python. Se il tuo output assomiglia a csv, puoi riceverlo come readprogram(blob) e aprire il blob con l'opzione csv per ottenere una tabella.Ri: Esecuzione di un exe Python da Esegui programma()@Michael_MXAK Hmm, anche questa è un'idea interessante. Per file più piccoli potrebbe funzionare correttamente. Alcuni di questi file potrebbero diventare piuttosto grandi, quindi il metodo riga per riga potrebbe non essere eccessivamente efficiente... È un ottimo spunto di riflessione, però.
Ri: Esecuzione di un exe Python da Esegui programma()@Craige_Hales Ok, ha senso... è lì che mi appoggiavo, ma l'output delle informazioni nella stringa per il recupero sarebbe più semplice da gestire rispetto a un secondo CSV.
Ri: Esecuzione di un exe Python da Esegui programma()Non l'ho fatto e al momento non posso testarlo facilmente sul mio sistema, ma sembra che tu possa leggere dallo stdout di un eseguibile e scrivere sui flussi stdin di un eseguibile utilizzando JSL: https://community.jmp.com/kvoqx44227/attachments/kvoqx44227/discovery-2016-content/67/1/Run%20Program.pdf
Python può leggere da stdin (e inviare l'output a stdout) come un'operazione simile a un file: Python: stdin, stdout e stderr - AskPython
Quindi sono ragionevolmente sicuro che potresti ` << Scrivere` la tua tabella dati riga per riga nello stdin dell'eseguibile da JMP, utilizzare un metodo simile a un file per leggere le righe da JMP in Python, costruire quelle righe in un Pandas dataframe, esegui le tue operazioni Python, quindi genera il dataframe Pandas riga per riga da Python allo stdout, restituendolo a JMP.
Ri: Esecuzione di un exe Python da Esegui programma()L'uso di un eseguibile creato da un programma Python tramite RunProgram o la chiamata dell'interprete Python con lo script Python da RunProgram è simile. Nessuno dei due ha l'integrazione che ha l'utilizzo di Python integrato. Dovrai utilizzare qualcosa come un file CSV per inviare dati al programma Python e recuperarli dal programma Python. È inoltre possibile passare i parametri della riga di comando al file .exe. (O all'interprete Python.)
Nel tuo caso suggerirei di scrivere il CSV nella directory $temp e di stampare i risultati in Python. Passa il percorso CSV tramite la riga di comando. Utilizzare RunProgram(...readfunction("text")...) per recuperare la stringa dell'output stampato. eliminare il file della directory temporanea.