JMP セッションを閉じずに、JMP の Python 側で「すべて」をクリアする方法はありますか (JSL の Delete Symbols() に似たもの、またはカーネルを再起動する方法)?
私は同僚と JMP Python 統合を利用したアプリケーションを開発していますが、Python コードを変更するたびに JMP を頻繁に閉じる必要があります。これは、古い Python コードがメモリ内に存在し、インポートによって既にインポートされたコードが上書きされないという問題が発生するため、Python を「クリア」するためです。
無視されているモジュールを更新しました。多くの驚きと不思議 - 気づくまで...
あぁ!
デルは機能しますか?
import sys
print(sys.path)
del sys
print(sys.path)
問題があります。ほとんどの Python スクリプトでは、Python 自体の存続期間がスクリプトと同じであることが多いため、この問題はあまり認識されません。長時間にわたって Python を対話的に実行し、同じ対話型セッション内で複数の処理を実行すると、問題に気づき始めるでしょう。NumPy など、一部の Python パッケージが C/C++ (さらには Fortran) で実装されているため、この問題はさらに複雑になります。Python はこれらを共有ライブラリとしてロードし、再起動以外に実行中のプロセスから共有ライブラリを安全にアンロードする方法はありません。JMP は Python 共有ライブラリ自体に関して同様の状況にあり、アンロードできません。はい、 del はオブジェクトを解放するために機能します。ただし、del sys は期待どおりの動作をしません。これは、「モジュール」を削除またはアンロードしたり、依存する dll をアンロードしたりするのではなく、ロードされたモジュールへの参照を保持している「sys」オブジェクトを削除するだけです。もう 1 つの側面は、sys は Python の組み込みモジュールであり、ロードされたモジュールと同じではないことです。さらに「sys」を削除しても、sys.path に別のパスを追加するなど、行った変更はクリーンアップされません。
そうした場合:
sys.path.append('/usr/local/bin')
print(sys.path)
del sys
print(sys.path). # gives error on sys
import sys
print(sys.path). # still contains the /usr/local/bin addition
上記は、ターミナル ウィンドウの対話型セッションで実行されました。Python を終了して再起動した場合にのみ、sys.path から /usr/local/bin がクリアされました。唯一の現実的な方法は、セッションで使用されたすべての変数を追跡し、セッションの終了時にそれらを削除することです。1 つの方法は、各変数をリストまたは辞書に入れて、セッションの終了時にコンテナーを削除することです。
私は、グローバル環境で実行されないコードを設定できる Python サブインタープリタの使用について調査しています。サブインタープリタは独立しており、サブインタープリタをシャットダウンすると Python のシャットダウンと再起動のように動作するという考えに基づいています。現時点では、JMP セッションの存続期間中にメインの Python インタープリタを安全にシャットダウンして再起動する方法は見つかっていません。
現在のPythonのモジュール再ロードの慣例(Python 3.4以降)は、
<SPAN class="hljs-keyword">import</SPAN> importlib
importlib.reload(modulename)
システムをリロードしようとすると
>>> importlib.reload(sys)
numpy をリロードすると、次の出力が得られます...
>>> importlib.reload(np)
/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/importlib/__init__.py:169: UserWarning: The NumPy module was reloaded (imported a second time). This can in some cases result in small but subtle issues and is discouraged.
_bootstrap._exec(spec, module)
UserWarningに注意してください:
ユーザー警告: NumPy モジュールが再ロードされました (2 回目のインポート)。これにより、小さいながらも微妙な問題が発生する場合があり、推奨されません。_bootstrap._exec(spec, module)
モジュールをリロードする「公式」の方法であっても、問題が発生する可能性があります。
importlib.reload() は、モジュールのソースへの変更がリロードまで反映されないため、コード内で Python モジュールを開発する場合に最適です。これにより、Python コードの .pyc への再コンパイルが強制される可能性があります。