(カスタム) JMP で実行される Python GUIやあみんな、
ユーザー入力を取得するために GUI を使用するカスタム Python パッケージがあります。このパッケージを JMP18 内から実行したいと考えています。
PY_SCRIPT = "
from mydummy.util import jmp
from mydummy.request import this_data
df = this_data().GUI()
jmp_source = jmp.df2jmp(df, 'MY DT')
";
EXECUTE = Python Execute({}, {jmp_source}, PY_SCRIPT);
If(EXECUTE == 0,
DT = Eval(Parse(jmp_source));
,
DT = New Table();
);一般的に、このスクリプトは機能します。GUI を作成し、Python でデータを処理し、それを JMP テーブル スクリプトに変換します。その後は、データ分析/グラフィックスに通常どおり JSL を使用できます。
ただし、Python Execute (および Run Programm) は常に JMP のすべてをフリーズします。そのため、GUI が開いて Python コードが実行されているときは、JMP で何も実行できなくなります。'~JMP\JMPPRO\18\jmp_python.exe' インスタンスの新しいインスタンスを開始する方法はありますか?
また、subprocess.Popen を使用した Python スクリプトも試しました。戻りを待つと、同じ問題が発生します。
私の GUI にはメイン スレッドが必要なので、スレッド化も不可能です。何らかの方法で新しい ~jmp_python.exe インスタンスを作成するか、jsl で処理する必要があります。
何か提案はありますか?それは可能ですか?
THX
自動化とスクリプトRe: (カスタム) JMP で実行される Python GUIJMP Python 統合はメイン スレッドで実行されているため、UI が引き継いで JMP をブロックします。サブプロセスを試して、jmp_python.exe のコマンド ライン起動コピーを指定して起動することができます。これが、jmp.PYTHON_EXE および jmp.PYTHONW_EXE 変数が存在する理由です (PYTHONW_EXE は 19 以上である可能性があります)。ただし、サブプロセスからはジャンプパッケージを利用することはできません。
Python GUI を実行すると、メインループが引き継がれ、最後のダイアログが閉じたときに JMP がクラッシュする可能性があるという問題が発生することがあります。これは、Python GUI メインループを終了すると、JMP が依存するメニュー項目、ウィンドウ ハンドルなどが削除される可能性があるためです。GUI アプリケーション内に埋め込まれている別の UI ツールキットを Python 経由でロードしようとしているため、これは危険です...
現時点では、これを行う最善の方法は、jmp.run_jsl を使用して Python から呼び出すことができる JSL で作成されたダイアログとウィンドウを使用して GUI を記述することだと考えています。これは、ディレクトリへのパスを取得するために JSL ディレクトリ ピッカーが使用される pyDigest.py サンプル スクリプトで実行できます。
jmp.run_jsl('''
localPath = Pick Directory("Choose Directory to checksum");
// Pick Directory on windows returns a leading / use Convert File Path()
If( Host is("Windows"),
localpath = Convert File Path( localPath, windows )
);
JMP のダイアログとウィンドウ機能の使用は互換性があります。外部 UI の問題を調査中です。
Re: (カスタム) JMP で実行される Python GUIRunProgram は、ReadFunction がないと、戻る前にすべての出力を収集するため、JMP をフリーズします。また、JMP がアイドル状態のとき、または wait(0) 中に呼び出される ReadFunction と一緒に使用して、アイドル時間がある限り JMP が他の作業を実行できるようにすることもできます。Make a Video in JMP with FFmpeg には、外部プログラムから読み取り、読み取った内容を JMP ログに書き込む単純な ReadFunction の例があります。