Pythonで他階層にあるモジュールのimport

Pythonで他の階層にあるモジュールをimportする時のメモ。
PythonではPythonファイルを実行する際に、そのファイルが置いてあるディレクトリをルートとして扱ってしまうという仕様があるみたいで、上位の階層や、隣のディレクトリにあるファイルを簡単にimportすることができない。この問題にはよく遭遇するのでその時の解決方法を残しておく。

階層構造

例えば、階層構造として下記のようなディレクトリ構成になっていることを考える。Pythonファイル"aaa.py"から、"bbb.py"をimportしたいケースを考える。

[any directory]/
 ┣ AAA/
 ┃  ┗ aaa.py  : **現在実行しているPythonファイル**
 ┗ BBB/
    ┗ bbb.py  : **importしたいPythonファイル**

__init__.pyの配置

モジュールとして認識させるため、それぞれのディレクトリに"__init__.py"を配置する。中身は空で構わない。その時のディレクトリ構成は下記となる。

[any directory]/
 ┣ AAA/
 ┃  ┣ __init__.py  : **initファイルを追加**
 ┃  ┗ aaa.py  : **現在実行しているPythonファイル**
 ┗ BBB/
    ┣ __init__.py  : **initファイルを追加**
    ┗ bbb.py  : **importしたいPythonファイル**

Pythonコード

osモジュールを利用して現在のディレクトリを取得し、上位のパスをsysモジュールを用いてpathリストにappendする。そうすることで、一つ上位の階層をpathに加えることができるので、"bbb.py"をimportすることができる。

aaa.pyの中身

import os
import sys
path = os.path.join(os.path.dirname(__file__), '../')
sys.path.append(path)

import BBB.bbb