IPython を使用して Python で大規模なプロジェクト (複数のファイルとフォルダーに分割) を開発しているときに、インポートされたモジュールのキャッシュの問題に遭遇しました。
問題は、そのモジュールが変更された場合でも、命令import module
がモジュールを一度しか読み取らないことです! そのため、パッケージ内の何かを変更するたびに、IPython を終了して再起動する必要があります。痛い。
一部のモジュールを適切に強制的にリロードする方法はありますか? または、Python がそれらをキャッシュしないようにする方がよいでしょうか?
いくつかのアプローチを試しましたが、どれもうまくいきません。特に、一部のモジュールや変数が不思議なことに等しくなるなど、本当に、本当に奇妙なバグに遭遇しNone
ます...
私が見つけた唯一の賢明なリソースはReloading Python modules、 from pyunit ですが、チェックしていません。私はそのようなものが欲しいです。
IPython を再起動するか、何らかの方法で Python インタープリターを再起動することをお勧めします。
では、Python で開発している場合、この問題に対してどのような解決策を見つけましたか?
編集
明確にするために: 明らかに、モジュールの以前の状態に依存するいくつかの古い変数が残っている可能性があることは理解しています。それは私には問題ありません。奇妙なエラーが発生することなくモジュールを強制的にリロードすることが Python で非常に難しいのはなぜですか?
より具体的には、モジュール全体が1 つのファイルmodule.py
にある場合、次のようにするとうまくいきます。
import sys
try:
del sys.modules['module']
except AttributeError:
pass
import module
obj = module.my_class()
このコードは美しく機能し、IPython を何ヶ月もやめることなく開発できます。
ただし、モジュールが複数のサブモジュールで構成されている場合は常に、地獄が解き放たれます。
import os
for mod in ['module.submod1', 'module.submod2']:
try:
del sys.module[mod]
except AttributeError:
pass
# sometimes this works, sometimes not. WHY?
モジュールが 1 つの大きなファイルにあるのか、複数のサブモジュールにあるのかによって、Python でこれほど異なるのはなぜですか? なぜそのアプローチがうまくいかないのでしょうか??