別ディレクトリにあるモジュールではないpyファイルを読み込む方法をメモ。
sys.pathを使った解決法
./directory1/util.py
./directory2/main.py
というように2つのファイルが異なるディレクトリに存在している。このときdirectory2から実行するmain.pyからutil.pyを相対パスで指定してインポートしたい。
import sys, os
sys.path.append(os.path.join('..', 'directory1'))
import util
from util import some_function
これであたかもdirectory1にいるのと同じような感じでutil.pyを読み込める。fromでも何でもdirectory1にいるのと全く同じようにインポートすることができる。
sys.pathでインポートできる仕組み
もはや説明不要。Pythonはインポートすべきファイルをsys.pathにあるディレクトリの中から探す。目的のファイルがあるパスを追加してやればdirectory1にいるときと同じインポートのやり方で読み込める。
これも当然、directory1から複数のpyをインポートする場合はsys.path.appendは1回だけでいい。
sys.pathがPython起動ごとにリセットされることも確認できたので実行ごとに不要なパスが蓄積していくことは無く、これがベストになるケースは結構ありそうだ。