前がき
pythonでファイルを扱うとき、一番強い且つ煩わしいものは、相対パスだと思います。相対パスを正しく使うには、「私は今、どこにいるの」ということを明確するのは重要です。
結論
pythonで、現在実行中ファイルのパスを取得には、__file__
変数を参照します。__file__
変数は、「どこで実行・誰から実行」を問わず、いつもファイル自身の絶対パスを返します。
この場合よく間違って使われるのは、pathlib.Path('.')
です。「.
」は「カレント・ディレクトリ」の意味で、その返り値はターミナルの作業デュレクトリによって変わります。
os.path
系メソッドは僕はよくわかりませんが、時代遅れそうなので、pathlib
を使った方がいいです。
使用例
ファイル構成
pathpath/
├── main.py
└── pkg.py
# pkg.py
from pathlib import Path
def hoge():
print('Path(.):', Path('.').resolve())
print('__file__:', __file__)
if __name__ == '__main__':
hoge()
# main.py
import pkg
pkg.hoge()
動作確認
フォルダ内で実行
$ pwd
/Users/tdzz/code/pathpath
$ python3 pkg.py
Path(.): /Users/tdzz/code/pathpath
__file__: /Users/tdzz/code/pathpath/pkg.py
$ python3 main.py
Path(.): /Users/tdzz/code/pathpath
__file__: /Users/tdzz/code/pathpath/pkg.py
フォルダ外で実行
$ pwd
/Users/tdzz/code
$ python3 pathpath/pkg.py
Path(.): /Users/tdzz/code
__file__: /Users/tdzz/code/pathpath/pkg.py
$ python3 pathpath/main.py
Path(.): /Users/tdzz/code
__file__: /Users/tdzz/code/pathpath/pkg.py
先に言った通り、pkg.py
に置いた__file__
変数は、フォルダ内でもフォルダ外でも、独自が実行されてもmain.py
から呼び出されても、自分の絶対パスを返すことが分かりました。
参照リンク