Ausführen einer Python-Exe über „Run program()“Ich habe eine ausführbare Python-Datei (ich oder andere brauchen also kein Python auf dem PC installiert), die einige Daten analysieren kann ...
Ich würde dies gerne von JMP aus aufrufen und ausführen, bin mir aber nicht sicher, wie ich am besten vorgehen soll, da ich in der Lage sein möchte, dieser Python-Exe-Datei von JMP aus Variablen zuzuführen und die Rückgabe zu erhalten.
Ich habe dies erfolgreich mit den integrierten Python-Befehlen gemacht, aber nie mit einer Stand-Along-Python-Exe-Datei. Eine der Variablen, die ich eingeben müsste, ist eine Datentabelle. Derzeit müsste JMP die Tabelle als .csv an einem temporären Speicherort speichern, dann kann diese Python-Exe diese .csv ausführen und bearbeiten ... dann kann JMP die aktualisierte CSV öffnen (ich habe diesen Stream nicht codiert). in JSL, da ich der Meinung bin, dass es einen besseren Weg geben muss)
Irgendwelche Gedanken? Ich habe nur minimale Erfahrung mit Run Command(), daher bin ich für alle Starthinweise dankbar 
Danke!
Erweiterte statistische ModellierungAutomatisierung und SkripterstellungVerbraucher- und MarktforschungDatenzugriffMassenanpassungBetreff: Ausführen einer Python-Exe über „Run program()“Ein funktionierendes Beispiel finden Sie in Erstellen Sie ein Video in JMP mit FFmpeg . Es wird die ausführbare FFmpeg-Datei verwendet, keine ausführbare Python-Datei, aber es zeigt sowohl das Lesen von stdout als auch das Schreiben in stdin an. Die Lesefunktion sendet nur ein Echo an das JMP-Protokoll, aber Sie können den Text puffern und bei Bedarf etwas anderes tun. Die Schreibfunktion streamt Bilder nacheinander zur Codierung nach FFmpeg.
Bei FFmpeg ist es nützlich, das Echtzeit-Echo im JMP-Protokoll zu haben, wenn Bilder an FFmpeg übergeben werden. Dadurch kann ich mitten in einem langen Prozess erkennen, ob etwas nicht stimmt. Wenn Sie einen kürzeren Prozess mit einer einzelnen (möglicherweise großen) Ausgabe am Ende haben, ist es bequemer, readfunction("text" or "blob") zu verwenden, mit dem JMP die Standardausgabe in eine einzelne Zeichenfolge puffern kann ist zurückgekommen. Es ist auch nicht erforderlich, auf die Beendigung des RunProgram zu warten (siehe Ende des Beispiels), um die Ergebnisse zu erhalten. Andererseits ermöglicht die Verwendung von readfunction(function(...)) JMP, mit der Verarbeitung der Ausgabe zu beginnen, während diese generiert wird.
Wenn das Python-Programm eine CSV-Datei an stdout ausgibt, sollte die Lesefunktion aus zwei Gründen einen Blob verwenden (auch wenn die Daten 7-Bit-ASCII sein sollten): Ein Blob kann größer als 2 GB sein, ein JSL-String jedoch nicht, und Sie können laden der Klecks als dt = open( blobVariable, „csv“) . Fügen Sie der CSV einen Header hinzu. Dies ist auch dann nützlich, wenn Sie nur einige benannte Werte als Tabelle mit einer einzelnen Zeile zurückgeben müssen.
Darin ist ein Beispiel-Python-Code vergraben Beowulf, Newton und Mr. Hanson das liest Befehlszeilenparameter – suchen nach getopt --, aber Sie können wahrscheinlich anderswo einfachere Beispiele finden. In diesem Beispiel verwendet JMP Plink (von Putty), um Python auf einem Remote-Computer auszuführen, und verwendet eine NFS-Festplatte im Netzwerk, um Daten auszutauschen.
Betreff: Ausführen einer Python-Exe über „Run program()“Ja, ich würde sagen, es lohnt sich, es zu testen. Ich habe unter Unix eine ähnliche Stream-Schreib-/Lesefunktion ausgeführt, um von einem sehr großen Pandas-Datenrahmen zu einer Postgres-Tabelle zu wechseln, und sie ist rasend schnell. Ich weiß nicht, wie die JMP-Implementierung aussieht, aber vielleicht können Sie die gesamte Tabelle auf einmal in die stdin schreiben? Als gigantische Liste von Listen vielleicht ...
Als Referenz habe ich die Python-Methode an einem Pandas-Datenrahmen getestet, der etwa 3 GB groß war und dessen Fertigstellung weniger als 10 Sekunden dauerte. Die Methode ist diese:
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)Was ich vor langer Zeit irgendwo auf einer Website gefunden habe (ich bin nicht so schlau
). Es verwendet einen Dateniterator und schreibt diese Zeile für Zeile in die stdin des Postgres-Cursors, ist aber immer noch extrem schnell.
Betreff: Ausführen einer Python-Exe über „Run program()“Der Vorteil von CSV oder Pandas besteht darin, dass Sie die Python-Ausgabe nicht analysieren müssen. Wenn Ihre Ausgabe wie eine CSV-Datei aussieht, können Sie sie als Leseprogramm (Blob) empfangen und das Blob mit der CSV-Option öffnen, um eine Tabelle zu erhalten.Betreff: Ausführen einer Python-Exe über „Run program()“@Michael_MXAK Hmm, das ist auch eine interessante Idee. Bei kleineren Dateien funktioniert es möglicherweise gut. Einige dieser Dateien können ziemlich groß werden, sodass die zeilenweise Methode möglicherweise nicht besonders effizient ist ... Es ist jedoch ein toller Denkanstoß.
Betreff: Ausführen einer Python-Exe über „Run program()“@Craige_Hales Ok, das macht Sinn ... das ist meine Absicht, aber die Informationen in die Zeichenfolge zum Abrufen auszugeben, wäre einfacher als eine zweite CSV-Datei.
Betreff: Ausführen einer Python-Exe über „Run program()“Ich habe dies nicht getan und kann es derzeit nicht einfach auf meinem System testen, aber es sieht so aus, als ob Sie mithilfe von JSL aus der Standardausgabe einer ausführbaren Datei lesen und in die Standarddatenströme einer ausführbaren Datei schreiben können: https://community.jmp.com/kvoqx44227/attachments/kvoqx44227/discovery-2016-content/67/1/Run%20Program.pdf
Python kann als dateiähnliche Operation aus stdin lesen (und nach stdout ausgeben): Python – stdin, stdout und stderr – AskPython
Ich bin mir also ziemlich sicher, dass Sie Ihre Datentabelle Zeile für Zeile in die Standarddatei der ausführbaren Datei von JMP schreiben, eine dateiähnliche Methode verwenden können, um die Zeilen von JMP in Python zu lesen, und diese Zeilen in eine Datei umwandeln könnten Pandas-Datenrahmen, führen Sie Ihre Python-Operationen aus, geben Sie dann den Pandas-Datenrahmen Zeile für Zeile von Python an die Standardausgabe aus und geben Sie ihn an JMP zurück.
Betreff: Ausführen einer Python-Exe über „Run program()“Die Verwendung einer aus einem Python-Programm erstellten ausführbaren Datei über RunProgram oder das Aufrufen des Python-Interpreters mit dem Python-Skript von RunProgram ist ähnlich. Keiner von beiden verfügt über die Integration, die die Verwendung des integrierten Python bietet. Sie müssen so etwas wie eine CSV-Datei verwenden, um Daten an das Python-Programm zu senden und Daten vom Python-Programm zurückzubekommen. Sie können der EXE-Datei auch Befehlszeilenparameter übergeben. (Oder an den Python-Interpreter.)
In Ihrem Fall würde ich vorschlagen, die CSV-Datei in das Verzeichnis $temp zu schreiben und die Ergebnisse in Python auszudrucken. Übergeben Sie den CSV-Pfad über die Befehlszeile. Verwenden Sie RunProgram(...readfunction("text")...), um die Zeichenfolge der gedruckten Ausgabe abzurufen. Löschen Sie die temporäre Verzeichnisdatei.