1

私は__import__pythonモジュールをインポートするために使用しています。ただし、その間に変更される可能性のあるモジュールを再インポートするソリューションを実装したいと思います(開発/デバッグ目的)。これを試してみても、「古い」モジュールが取得されます。これは、既にインポートされているためだと思います。同じ .py ファイル名からモジュールの新しいバージョンを何らかの方法で python に強制的に再インポートすることはできますか? 何らかのエラー防止動作が必要なため、再インポートする前に古いモジュールを削除することはできません (これは役立つと思います)。(再)インポートが失敗した場合は、古いモジュールを引き続き使用したいのです。

この多かれ少なかれ擬似コードのようなもの:

mod = None
reload_trigger = True
MODULE_NAME = "mymodule.py"
while True:
    if reload_trigger:
        reload_trigger = False
        try:
            mod_new = __import__(MODULE_NAME)
        except ImportError as a:
            if mod is None:
                raise RuntimeError("Initial module import failed, cannot continue!")
            print("Import problem, still using the old module: " + str(a))
            continue
        mod = mod_new
        del mod_new
     mod.main_loop_iterate_etc()  # it may also set reload_trigger to True

Afaik reload() を使用してモジュールを再インポートできますが、再インポートが失敗した場合の状況を処理する方法がわからないため、代わりに古いモジュールを引き続き使用できます。例外ハンドラーで reload() を「保護」して、インポートの問題などをキャッチするだけで十分ですか?

また、再インポートしたモジュールがインポートするすべてのモジュールをリロードする状況を手動で処理する必要がありますか? 「依存関係」と同様にそれらをリロードしたいので。

ありがとう!

4

1 に答える 1

1

モジュールを再インポートする正しい方法は を使用するreloadことですが、再インポートの失敗から保護したいのは正しいです。superreloadIPython autoreload 拡張機能 ( source )を参照することをお勧めします。

これにより、リロードのエラーが処理されます。

old_dict = module.__dict__.copy()
try:
    module = reload(module)
except:
    module.__dict__.update(old_dict)
    raise
于 2012-08-15T09:38:32.730 に答える