Run Program() から Python exe を実行する一部のデータを分析できる Python 実行可能ファイルがあります (つまり、私や他の人が PC に Python をインストールする必要はありません)。
これをJMPから呼び出して実行したいのですが、JMPからこのPython exeに変数を供給して戻り値を取得できるようにしたいので、最善の方法がわかりません。
私は統合された Python コマンドを使用してこれを正常に実行しましたが、スタンドアロンの Python exe ファイルを使用したことはありませんでした。 入力する必要がある変数の 1 つはデータ テーブルです。 現在、JMP にテーブルを .csv として一時的な場所に保存させる必要があります。その後、この Python exe を実行してその .csv を編集できます。その後、JMP は更新された CSV を開くことができます (そのストリームはコーディングされていません)もっと良い方法があるはずだと思うので、JSLで
何かご意見は? 私は Run Command() の経験が最小限なので、開始点を教えていただければ幸いです:)
ありがとう!
高度な統計モデリング自動化とスクリプト作成消費者および市場調査データアクセスマスカスタマイゼーションRe: Run Program() から Python exe を実行するに実際の例がありますFFmpeg を使用して JMP でビデオを作成する。 Python 実行可能ファイルではなく FFmpeg 実行可能ファイルを使用していますが、stdout からの読み取りと stdin への書き込みの両方を示しています。 読み取り関数は JMP ログにエコーするだけですが、必要に応じてテキストをバッファリングして他のことを行うこともできます。 write 関数は、エンコードのために画像を一度に 1 つずつ FFmpeg にストリーミングします。
FFmpeg では、画像が FFmpeg に渡されるときにリアルタイムで JMP ログにエコーすると便利です。長いプロセスの途中で何か問題がないかどうかを確認できます。 プロセスが短く、最後に単一の (おそらく大きな) 出力がある場合は、JMP が stdout を単一の文字列にバッファリングできる readfunction("text" または "blob") を使用する方が便利であることがわかります。戻ってきた。 また、結果を取得するために RunProgram が終了するまで待つ必要もありません (例の最後を参照)。 一方、readfunction(function(...)) を使用すると、JMP は出力の生成中に出力の処理を開始できます。
Python プログラムが CSV を stdout に出力する場合、readfunction は次の 2 つの理由から BLOB を使用する必要があります (データは 7 ビット ASCII である必要がありますが)。BLOB は 2GB を超えることができますが、JSL 文字列は禁止されています。としてのブロブdt = open( blobVariable, "csv") 。 CSV にヘッダーを追加すると、いくつかの名前付き値を 1 行のテーブルとして返す必要があるだけの場合でも便利です。
Pythonコードの例がいくつか埋め込まれていますベーオウルフ、ニュートン、ミスター・ハンソンコマンドラインパラメータを読み取る -- を検索します取得-- ですが、おそらく他の場所でより簡単に使用できる例が見つかるでしょう。 この例では、JMP は (putty からの) plink を使用してリモート マシン上で Python を実行し、ネットワーク上の NFS ディスクを使用してデータを共有しています。
Re: Run Program() から Python exe を実行するそうですね、試してみる価値はあると思います。 非常に大きな Pandas データフレームから Postgres テーブルに移行するために、同様のストリーム書き込み/読み取り関数を Unix で実行しましたが、非常に高速でした。 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 カーソルの標準入力に書き込みますが、それでも非常に高速です。
Re: Run Program() から Python exe を実行するCSV または Pandas の利点は、Python 出力を解析する必要がないことです。 出力が csv のように見える場合は、それを readprogram(blob) として受け取り、csv オプションを使用して BLOB を開いてテーブルを取得できます。Re: Run Program() から Python exe を実行する@Michael_MXAKうーん、それも面白いアイデアですね。 小さいファイルの場合はうまく動作する可能性があります。 これらのファイルの一部はかなり大きくなる可能性があるため、行ごとの方法はあまり効率的ではない可能性があります... ただし、それは思考の素晴らしい材料です。
Re: Run Program() から Python exe を実行する@Craige_Hales OK、それは理にかなっています...私はそこに傾いていましたが、情報を取得用の文字列に出力する方が、2 番目の CSV を扱うよりも簡単でしょう。
Re: 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 - stdin、stdout、stderr - AskPython
したがって、JMP から実行可能ファイルの stdin にデータ テーブルを 1 行ずつ「<<書き込み」することができ、ファイルのようなメソッドを使用して Python で JMP から行を読み取り、それらの行をPandas データフレームを使用して Python 操作を実行し、Python から Pandas データフレームを 1 行ずつ stdout に出力し、それを JMP にフィードバックします。
Re: Run Program() から Python exe を実行するRunProgram を介して Python プログラムからビルドされた実行可能ファイルを使用することも、RunProgram から Python スクリプトを使用して Python インタープリターを呼び出すことも同様です。 どちらも、統合された Python を使用する場合にあるような統合はありません。 Python プログラムにデータを送信したり、Python プログラムからデータを取得したりするには、CSV ファイルなどを使用する必要があります。 コマンド ライン パラメータを .exe に渡すこともできます。 (または Python インタプリタに。)
あなたの場合、CSV を $temp ディレクトリに書き込み、結果を Python で出力することをお勧めします。 コマンドライン経由で csv パスを渡します。 RunProgram(...readfunction("text")...) を使用して、印刷出力の文字列を取得します。一時ディレクトリファイルを削除します。