.この薄っぺらいブログが見えるというのか/

自転車・PC・読書感想。サイクリング部の大学生やってます。

pathlibでカレントディレクトリ取得できない問題

parent/
 └ child/
  └ main.py

main.pyが

from pathlib import Path
print(Path('.').resolve())

だとする。このとき

$ pwd
parent/
$ python child/main.py
(上位パス)/parent/child

となることを期待するが、残念ながらこうはならず、

$ python child/main.py
(上位パス)/parent

と出力されてしまう。

まとめると

parent/から parent/child/main.pyのPath('.')を実行するとPath('parent/child')ではなく、Path('parent')が帰ってきてしまう

ということだ。これをcd取得出来ない問題という。これでは非常に困る。たとえばparent/child/main.py からparent/ref.txt を参照するときにPath('.').parent / 'ref.txt'では参照できない。正確に言えば、cwdがchildだと正常に実行できるが、parent/だとエラーになる。

これを解決するにはまず

  1. main.pyが存在する位置を絶対パスでとってきて
  2. その親ディレクトリにアクセスし
  3. ref.txtを参照する

ことが必要になる。

結論から言うと

Path(__file__).resolve().parents[1] / 'ref.txt'

でcwdに関わらずref.txtにアクセスできる。

os.pathとか使う方法は色々ネットにあったけどpathlib単体で解決する方法はなかったので記事にした。