從 Run program() 執行 python exe我有一個 python 可執行文件(所以我或其他人不需要在電腦上安裝 python),它可以分析一些數據......
我想從 JMP 調用並運行它,但我不確定最好的方法,因為我希望能夠從 JMP 向這個 python exe 提供變量並獲得返回。
我已經使用集成的 python 命令成功完成了此操作,但從未使用獨立的 python exe 文件。 我需要輸入的變量之一是數據表。 目前,我需要讓 JMP 在臨時位置將表保存為 .csv,然後這個 python exe 可以運行並編輯該 .csv ...然後 JMP 可以打開更新的 CSV(我沒有對該流進行編碼)在JSL中,因為我覺得一定有更好的方法)
有什麼想法嗎? 我對 Run Command() 的經驗很少,因此任何起始指針將不勝感激:)
謝謝!
高級統計建模自動化和腳本編寫消費者和市場研究數據存取大規模定制回复:從 Run program() 執行 python exe有一個工作示例使用 FFmpeg 在 JMP 中製作視頻。 它使用 FFmpeg 可執行文件,而不是 python 可執行文件,但它確實顯示從 stdout 讀取和寫入 stdin。 讀取函數僅回顯 JMP 日誌,但您可以緩衝文本並根據需要執行其他操作。 寫入功能將圖像流式傳輸到 FFmpeg 進行編碼,一次一個。
使用 FFmpeg,當圖像傳遞到 FFmpeg 時,實時回顯 JMP 日誌非常有用;它讓我可以看到在漫長的過程中是否出現了問題。 如果您的流程較短,最後只有一個(可能很大)輸出,您會發現使用 readfunction("text" 或 "blob") 更方便,它可以讓 JMP 將標準輸出緩衝到單個字符串中,即回。 它也不需要等待(參見示例末尾)RunProgram 終止即可獲取結果。 另一方面,使用 readfunction(function(...)) 確實允許 JMP 在生成輸出時開始處理輸出。
如果 python 程序將 CSV 輸出到 stdout,則 readfunction 應使用 blob,原因有兩個(即使數據應為 7 位 ASCII): blob 可以大於 2GB,但 JSL 字符串不能,並且您可以加載斑點為dt = open( blobVariable, "csv") 。 在 CSV 上添加標題,即使您只需要以單行表的形式返回一些命名值,它也很有用。
有一些示例 python 代碼埋在貝奧武甫、牛頓和漢森先生讀取命令行參數——搜索獲取選擇--,但是您可能可以在其他地方找到更容易使用的示例。 在該示例中,JMP 使用 plink(來自 putty)在遠程計算機上運行 python,並使用網絡上的 NFS 磁盤來共享數據。
回复:從 Run program() 執行 python exe是的,我想說這值得測試。 我在 Unix 上運行了一個類似的流寫入/讀取功能,用於從非常大的 Pandas 數據幀到 Postgres 表,而且速度非常快。 我不知道JMP的實現是什麼樣的,但也許你可以一次性將整個表寫入stdin? 作為一個巨大的列表列表也許......
作為參考,我在大小約為 3 GB 的 Pandas 數據幀上測試了 Python 方法,完成時間不到 10 秒。 方法是這樣的:
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)我很久以前在某個網站上發現的(我沒那麼聰明;) )。 它使用數據迭代器並將其逐行寫入 postgres 游標的標準輸入,但它仍然非常快。
回复:從 Run program() 執行 python exeCSV 或 Pandas 的優點是您不必解析 python 輸出。 如果您的輸出看起來像 csv,您可以將其作為 readprogram(blob) 接收,並使用 csv 選項打開 blob 以獲取表格。回复:從 Run program() 執行 python exe@邁克爾_MXAK嗯,這也是一個有趣的想法。 對於較小的文件,它可能工作得很好。 其中一些文件可能會變得相當大,因此逐行方法可能不會過於高效...... 不過,這確實是一個值得深思的話題。
回复:從 Run program() 執行 python exe@Craige_Hales好吧,這是有道理的......這就是我所傾向於的地方,但是將信息輸出到字符串中進行檢索比處理第二個 csv 更容易。
回复:從 Run program() 執行 python exe我還沒有這樣做,目前無法在我的系統上輕鬆測試它,但看起來您可以使用 JSL 從可執行文件的 stdout 讀取並寫入可執行文件的 stdin 流: https://community.jmp.com/kvoqx44227/attachments/kvoqx44227/discovery-2016-content/67/1/Run%20Program.pdf
Python 可以從 stdin 讀取(並輸出到 stdout)作為類似文件的操作: Python - 標準輸入、標準輸出和標準錯誤 - AskPython
因此,我相當確定您可以將數據表逐行寫入 JMP 可執行文件的標準輸入,使用類似文件的方法從 Python 中的 JMP 讀取行,將這些行構造為Pandas 數據幀,運行Python 操作,然後將Pandas 數據幀從Python 逐行輸出到標準輸出,並將其反饋回JMP。
回复:從 Run program() 執行 python exe使用通過 RunProgram 從 Python 程序構建的可執行文件,或者使用 RunProgram 中的 Python 腳本調用 Python 解釋器是類似的。 兩者都沒有使用集成 Python 所具有的集成性。 您需要使用 CSV 文件之類的文件將數據發送到 Python 程序並從 Python 程序取回數據。 您還可以將命令行參數傳遞給 .exe。 (或者到 python 解釋器。)
對於你的情況,我建議將 CSV 寫入 $temp 目錄並在 python 中打印結果。 通過命令行傳遞 csv 路徑。 使用 RunProgram(...readfunction("text")...) 檢索打印輸出的字符串。刪除臨時目錄文件。