pythonでの相対パスの扱い

ちょっと勘違いしていたことがあったのでメモ。

次のようなパッケージの階層構造を考える。

package1
 −fileDir(ファイル置き場)
  −file.conf
 −package2(共通クラス置き場)
  −common.py
 −package3-1
−aaa.py
  −test
   −test_aaa.py
  −package4
−bbb.py
   −test
    −test_bbb.py

当初、common.pyからファイル置き場ディレクトリを参照する際に、次のように書いていた。

codecs.open('../../fileDir/file.conf', 'r', encoding='utf-8')


この状態でtest_aaa.pyからcommon.pyのインスタンスを作成して呼びだしてその中でfile.confを読み込もうとした場合は問題なく動いていた。
ただ、test_bbb.pyから同じようにcommon.pyのインスタンスを作成して呼び出してその中でfile.confを読もうとしても、「FileNotFoundError: [Errno 2] No such file or directory」となる。

つまり、相対パスは、common.pyからの相対パスではなく、test_aaa.pyやtest_bbb.pyからの相対パスとなる。

これを解消するには絶対パスを取得して相対パスとつなげれば良さそう。
下記によって調べたところ、os.path.dirname(os.path.abspath(__file__))を使えば良さそう。

os.path.dirname(os.path.abspath(__name__)) ← これだとtest_aaa.pyやtest_bbb.pyの絶対パスとなる。
os.path.dirname(os.path.abspath(__file__)) ← これだとcommon.pyの絶対パスとなる。