logo

Python でモジュールをリロードする

インタプリタを再起動せずに 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 モジュールからインポートする必要があります。

Python
import 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() を使用することです。

Python
import mymodule import importlib # Modify 'mymodule.py' externally... importlib.reload(mymodule) 

説明:

ライブクリケットです
  • mymodule は最初に通常どおりインポートされます。
  • 次に、importlib.reload(mymodule) は更新されたモジュールを再ロードします。
  • これは、Python 3.4 以降でモジュールをリロードする現在の公式の方法です。

注: モジュールの変更をテストする場合は、すべての最新の Python スクリプトおよびノー​​トブックでこのメソッドを使用してください。

Python でモジュールをアンロードできますか?

現在、Python には、インポートされたモジュールを完全にアンロードする組み込みの方法が提供されていません。モジュールがメモリにロードされると、プログラムが終了するまで sys.modules で利用可能な状態になります。 sys.modules からモジュールを削除することはできますが、メモリから完全に削除されるか、その参照がなくなることは保証されません。

Python
import mymodule import sys del sys.modules['mymodule'] 


ターミナルカリLinux

これにより、sys.modules キャッシュからモジュールが削除されるだけです。変数またはオブジェクトがまだモジュールを参照している場合、それらは完全にはアンロードされません。

アンロードがサポートされていないのはなぜですか?

  • Python はモジュールをメモリ内でグローバルに管理します。
  • コードの一部が古いモジュールへの参照を保持している場合、動的にアンロードすると動作が不安定になる可能性があります。