サブディレクトリ内にあるモジュールをimportする方法

Google App Engine では app.yaml を含むディレクトリがルートディレクトリとなります。ルートディレクトリは Python モジュールのインクルードパスに含まれます。


例として、以下のディレクトリ構造を持つアプリケーションがあるとします。この場合、Dir1 ディレクトリがルートディレクトリとなります。

Dir1/
   app.yaml
   ipf1.py
   Dir2/
      exe1.py
      exe2.py
      ipf2.py

Dir2/exe1.py 内で Dir1/ipf1.py と Dir2/ipf2.py を import するとします。


何も設定を行わない場合、import ipf1 は成功しますが、import ipf2 は ImportError となります。このエラーの原因は、ルートディレクトリはインクルードパスに含まれているため検索され ipf1.py を見つけることができるのに対して、サブディレクトリは検索されないため ipf2.py を見つけることができないためです。


サブディレクトリにあるモジュールを import するには以下の処理が必要となります。

  1. Dir2 ディレクトリに __init__.py ファイルを作成します。__init__.py ファイルは空でもかまいません。

    $ cd Dir2
    $ touch __init__.py
    


  2. Dir2/exe1.py で、(ディレクトリ名).(ファイル名)という形式で import します。

    import dir2.ipf2
    



以上をまとめると、ディレクトリ構造とコードは以下のようになります。

Dir1/
   app.yaml
   ipf1.py
   Dir2/
      __init__.py
      exe1.py
      exe2.py
      ipf2.py
[Dir2/exe1.py]
import ipf1
import dir2.ipf2


こちらの URL を参考にさせていただきました。