パッケージに含まれたモジュールをいっぺんに reload する正しくない方法
kissa パッケージを開発しているとしよう。Python を対話的に使っていて、import kissa すると、kissa/__init__.py の中で必要なモジュールを from . import lintu のように import している。パッケージはまだまだ開発中でいろいろいじっているので、対話的なセッションを終了しないで新しいバージョンを import し直したい。たとえば kissa/lintu.py をいじったので、それを現在の Python インタプリタに reload させたい。
普通に imp.reload(kissa) とすると、kissa/__init__.py は reload される。けれど、そこから import している lintu.py は reload されない。imp.reload(kissa.lintu) とやりたいところだけれど、__main__ では kissa.lintu を import していないので kissa.lintu という名前が辞書にない。
正しいやりかたがよくわからないのだが、sys.modules に登録されたモジュールが入っているらしいので、これと imp.find_module, imp.load_module で対処してみた。
import sys import imp for fqname in sys.modules.keys(): # mod = sys.modules[fqname] if fqname.find('kissa') == 0: path = fqname.split('.') name = "__init__" if len(path) == 1 else path.pop() fp, file, desc = imp.find_module(name, path) imp.load_module(fqname, fp, file, desc)
パッケージがサブパッケージをもった kissa.karhu.koira のような場合には対処できてないけれど、とりあえずの用は足りそう。
「え、こうやればもっと簡単なのに、なにやってんの?」というツッコミを期待。