Python を使用して JSL スクリプトを JMP 18 に更新するPython スクリプトを呼び出す jsl スクリプトがあり、これを JMP 18 の新しい Python 機能に合わせて更新したいと考えています。
JMP 18 までは、Python 接続を準備するために次のような操作を行っていました。
// Python setup
Python Init( Debug Print Statements( "TRUE" ), Init Trace("TRUE"), Debug Print Output("TRUE") );
Python Submit(
"\[
import numpy as _JMPnp
import scipy as _JMPsp
import pandas as _JMPpd
import sqlite3 as _JMPsq
if PY_DEBUG_OUTPUT:
print("Python Imports OK")
]\"
);Python Init() は現在非推奨となっているため、次のことが疑問です。a) Python send()、submit() などを使用する前に Python 接続を初期化する必要があるかどうか。b) 必要な場合、Python connect() を使用してどのように行うのでしょうか。
私の現在の理論では、上記の要素を次のように置き換える必要があると思います。
Python connect();
Python submit (
...blablabla...
);
しかし、これに関するドキュメントと例は少々不足しています。
自動化とスクリプトRe: Python を使用した jsl スクリプトを JMP 18 に更新するJMP 18 で Python 環境を「初期化」するには、Python Init() も Python Connect() も必要ありません。Python は JMP に組み込まれており、インストールされるので、すぐに使用できます。これが、Python Init() が非推奨になった理由です。Python Connect は、接続オブジェクトの使用をサポートするために引き続き存在します。
conn = Python Connect();
conn << Get( dt );
conn << Submit("\[ ... python コード ... ]\");
接続オブジェクトが必要ない場合は、Python Init() も Python Connect() も必要ありません。次のようにするだけです。
Python 送信(
...ここに私のコードがあります...
);
Re: Python を使用した JSL スクリプトを JMP 18 に更新する必要なパッケージが見つからないというエラーが表示されたため、何らかの初期化が必要だと考えたのが私の考えの誤りだったと思います。
しかし、jmputils.jpip('list') を実行した後、最初にそれらをインストールする必要があることがわかりました (numpy や pandas などの標準パッケージはプリインストールされていると想定していました)。
Re: Python を使用した JSL スクリプトを JMP 18 に更新するJMP 18.0には、JMP内でPythonを実行する際に競合を引き起こす可能性のあるパッケージを除いて、標準のPython.orgディストリビューションのみが同梱されています。主にtkinterとvenvです。外部パッケージはユーザーがインストールする必要があります。これにはいくつかの理由があります。JMPに同梱されているサードパーティ製のライブラリ、パッケージ、オープンソースコンポーネントはすべて、法務部門によるレビューを含む社内の複数の承認プロセスを経る必要があります。また、バグ修正やセキュリティ上の問題がないか、JMPがパッケージを監視していることも理由の1つです。さらに、パッケージには非互換性が存在するため、JMPが選択したパッケージバージョンは、必要なパッケージと競合する可能性があります。標準ライブラリに同梱されているもの以外で必要なパッケージを選択するのは、ユーザー自身です。
JMP 14-17 Python スクリプトを移植する際に注意すべきその他の項目。
- 環境は JMP をシャットダウンしたときにのみ消去されるため、Python Term(); は不要です。
- Python Get Graphics(); was removed from JMP 18. This single function caused a dependency on matplotlib. And the goal is to prevent JMP from requiring any external packages for basic functionality. It is easy enough to replicate the same functionality in your own scripts. The Scripting Index example for 'Python Get Graphics();' contains a complete example of the replacement code. Simply save the figure to an image file and open the image in a JMP window.
Python Submit("\[
...
# save image to location of your choosing
plt.savefig('/tmp/get_graphics_img.png')
]\");
// plot = Python Get Graphics( png ); // DEPRECATED
plot = Open( "/tmp/get_graphics_img.png", png );
pngJMP = New Window( "Plot", Picture Box( plot ) );
Python Submit( "plt.close()" );
rc = Delete File( "/tmp/get_graphics_img.png" );
- PythonのControl()は、matplotlibのオプション設定に使用されていました。18.0では削除されませんが、現在はログに「非推奨」の警告を出力するだけの機能となっています。
- Python Is Connected(); は常に true を返すため非推奨です。Python 環境は常に利用可能です。
最後に注意すべき問題が 1 つあります。mx = Python Get( numpy.ndarray ); で問題が見つかりました。NumPy 配列が 2 次元より大きい場合、結果は得られますが、2 次元より大きい部分は失われます。また、NumPy 配列のメモリ レイアウトが行優先 (C スタイル) ではなく列優先 (Fortran スタイル) の場合にも問題が発生しました。これにより、JMP がクラッシュする可能性があります。この問題は解決されています。修正は JMP 18.1 に含まれています。JMP 18.0 でこの問題に遭遇した場合は、NumPy データが行優先形式であること、および 1 次元または 2 次元の ndarray のみを 'Get' することを確認してください。ndarray を Get() すると、1 次元または 2 次元のみをサポートする JSL マトリックスを作成しようとします。このバグは JMP 18.0 に固有のもので、JMP 14-17 ではデータを倍精度浮動小数点数の一時バイナリ ファイルとしてファイル システム経由で転送していたためです。ただし、次元数が 2 より大きい場合、14 ~ 17 ではデータが失われる可能性があります。