インタプリタを再起動せずに Python モジュールを更新してテストしたい場合があります。これは、開発中にモジュール ファイルを外部で変更し、その変更をすぐに反映したい場合に特に役立ちます。 Python では、reload() 関数を使用して、以前にインポートしたモジュールを再ロードできます。 例えば スクリプトの実行中にユーティリティ ファイル utils.py を編集した場合、リロードにより、Python シェルを再起動せずに、更新されたコンテンツを再インポートできます。
いつモジュールをリロードする必要がありますか?
- デバッグ中またはライブテスト中
- IPython や Jupyter などの対話型インタープリターを使用する場合
- プラグインまたはモジュラー システムの開発中
- セッションを再起動せずに、外部 .py ファイルに加えられた変更を反映するには
Python 2.x でのモジュールのリロード
Python 2.x では、組み込みの reload() 関数を直接使用して、以前にインポートされたモジュールを再ロードできます。
Javaのデータ構造Python
import mymodule # Modify 'mymodule.py' externally here... reload(mymodule)
説明:
- mymodule は最初に import を使用してインポートされます。
- mymodule.py に外部変更を加えた後、 reload(mymodule) を呼び出すと、インタープリターを再起動せずに更新されたバージョンがリロードされます。
- 再インポートする必要はありません。reload() は、すでにインポートされたモジュール オブジェクトに対して機能します。
Python 3.0 から 3.3 へのモジュールのリロード
Python バージョン 3.0 から 3.3 では、組み込みの reload() 関数が削除されました。代わりに、imp モジュールからインポートする必要があります。
Pythonimport mymodule import imp # Modify 'mymodule.py' externally... imp.reload(mymodule)
説明:
- まず、mymodule が通常どおりインポートされます。
- imp モジュールは、このバージョン範囲で reload() 関数を提供します。
- mymodule.py を編集した後、imp.reload(mymodule) は更新された変更を使用してモジュールを再読み込みします。
注: imp モジュールは Python 3.4 では非推奨となり、importlib に置き換えられました。
Python 3.4 以降でのモジュールのリロード
Python 3.4 以降、モジュールをリロードする推奨される方法は、importlib.reload() を使用することです。
Pythonimport mymodule import importlib # Modify 'mymodule.py' externally... importlib.reload(mymodule)
説明:
ライブクリケットです
- mymodule は最初に通常どおりインポートされます。
- 次に、importlib.reload(mymodule) は更新されたモジュールを再ロードします。
- これは、Python 3.4 以降でモジュールをリロードする現在の公式の方法です。
注: モジュールの変更をテストする場合は、すべての最新の Python スクリプトおよびノートブックでこのメソッドを使用してください。
Python でモジュールをアンロードできますか?
現在、Python には、インポートされたモジュールを完全にアンロードする組み込みの方法が提供されていません。モジュールがメモリにロードされると、プログラムが終了するまで sys.modules で利用可能な状態になります。 sys.modules からモジュールを削除することはできますが、メモリから完全に削除されるか、その参照がなくなることは保証されません。
Pythonimport mymodule import sys del sys.modules['mymodule']
ターミナルカリLinux
これにより、sys.modules キャッシュからモジュールが削除されるだけです。変数またはオブジェクトがまだモジュールを参照している場合、それらは完全にはアンロードされません。
アンロードがサポートされていないのはなぜですか?
- Python はモジュールをメモリ内でグローバルに管理します。
- コードの一部が古いモジュールへの参照を保持している場合、動的にアンロードすると動作が不安定になる可能性があります。