パッケージに含まれたモジュールをいっぺんに 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 のような場合には対処できてないけれど、とりあえずの用は足りそう。

「え、こうやればもっと簡単なのに、なにやってんの?」というツッコミを期待。