1. ホーム
  2. python

[解決済み] Pythonモジュールをアンロード(再ロード)するにはどうしたらいいですか?

2022-03-19 22:45:15

質問

長期間稼働しているPythonサーバーを使用していますが、サーバーを再起動せずにサービスをアップグレードできるようにしたいです。これを行う最良の方法は何でしょうか?

if foo.py has changed:
    unimport foo  <-- How do I do this?
    import foo
    myfoo = foo.Foo()

解決方法は?

既にインポートされているモジュールを再読み込みするには importlib.reload() :

from importlib import reload  # Python 3.4+
import foo

while True:
    # Do some things.
    if is_changed(foo):
        foo = reload(foo)

Python 2の場合。 reload はビルトインでした。Python 3では、それは 移動 に変更しました。 imp モジュールになります。3.4では imp 非推奨 の代わりに importlib . 3 以降をターゲットとする場合は、以下のように、適切なモジュールを参照しながら reload またはインポートしてください。

ということなのでしょう。Django の開発サーバのようなウェブサーバは、サーバプロセス自体を再起動することなく、コードの変更の効果を見ることができるように、これを使用しています。

ドキュメントから引用すると

<ブロッククオート
  • Python モジュールのコードは再コンパイルされ、モジュールレベルのコードが再実行され、モジュールの辞書の名前にバインドされた新しいオブジェクトのセットを定義します。 ローダー をロードした。そのため init 関数は2度目は呼び出されません。
  • Python の他のすべてのオブジェクトと同様に、古いオブジェクトはその参照カウントがゼロになった後にのみ再生されます。
  • モジュールの名前空間内の名前は、新しいまたは変更されたオブジェクトを指すように更新されます。
  • 古いオブジェクトへの他の参照(モジュールの外部の名前など)は、新しいオブジェクトを参照するようにリバウンドしないので、それが必要な場合は、それらが発生する各ネームスペースで更新する必要があります。

ご質問の中にあるように、再構築するのは Foo オブジェクトが Foo クラスが foo モジュールになります。