http://biokids.org/43ea9e.htmlどぶお/Pythonで遊ぼう!論理パッケージを複数のパッケージに分けるどういうこと?モジュールを作成している時に、一つの論理パッケージを複数のディレクトリで構成したい時があります。biokids.ccp4utilモジュールとbiokids.xdsutilモジュールを開発しているけど、これらはbiokidsパッケージである、という場合です。ディレクトリは以下のような構成になります。biokids.xdsutilモジュール一つのディレクトリで構成すればいいのですが、別々にバージョン管理をしたいとか、まだ開発途中であるとか理由はいろいろあると思います。こんな時はどのようにすれば適切に読み込めるのでしょう?読み込むためにはまず、サーチパスについて考えてみましょう。PYTHONPATHを以下のようにすれば読み込めそうです。PYTHONPATH=lib3:lib2:lib1ところが、この場合、biokidsモジュールはlib3/で見つかってしまうので、lib2/は検索に行かず、biokids.ccp4utilモジュールが見つからない、となってしまいます...。この問題は以下コードをlib3/biokids/__init__.pyに記述することで解決されます。http://docs.python.jp/2/library/pkgutil.html動作としては以下のようになります。lib1の順に検索lib2/biokids/ccp4util.pyを発見biokids.ccp4utilを読み込みこれでディレクトリが分散されていても一つのパッケージのように振る舞うことができます。__init__.pyは?ところがもう一つ問題があります。biokidsがうまく動作しません。biokidsモジュールはlib3/biokids/__init__.pyなのでlib1/biokids/__init__.pyを読み込まないのです。これを解決するには少々トリッキーな方法が必要になります。上記のextend_pathと組み合わせます。lib3/biokids/__init__.pyつまりモジュール検索で一番最初にヒットするbiokids/__init__.pyを以下の内容にします。key))これは、extend_path()でまず__path__を拡張し、自分を含まないパス一覧(__path__[1:])から__init__.pyを読み込んで、内容を自分自身(sys.modules[__name__])に追加する、という動作をします。スマートな方法があるかもしれませんが、とりあえずこれで望む動作ができました。コメントコメントなどありましたらよろしくお願いします。