Pythonで実行中のスクリプトのパスを取得する: __file__, os.path.abspath, os.path.dirname, os.path.basename

292, 2021-07-20

目次

Pythonでパスを取得する

Pythonの実行中のスクリプト内で、スクリプト・ファイルのパスを取得する方法を解説します。
パスの取得には__file__os.path.abspath(), os.path.dirname()os.path.basename()などを使います。

結論から言うとパスの取得は↓のようにやります。

import os


print(__file__)  # スクリプトのパスを参照
# /blogsnippets/python/pathget/intro.py

print(os.path.abspath(__file__))  # 絶対パスを取得
# /blogsnippets/python/pathget/intro.py

print(os.path.dirname(os.path.abspath(__file__)))  # 絶対パスでディレクトリを取得
# /blogsnippets/python/pathget

print(os.path.basename(__file__))  # ファイル名を取得
# intro.py

スクリプトの存在するディレクトリ内になにかファイルやディレクトリを作ってごにょごにょしたいという場合に、こういったパスの取得が必要になることがあります。
基本的にはos.path.abspath()os.path.dirname()を組み合わせればスクリプトの存在するディレクトリは取得できます。

この記事では具体的にパスの取得について↓を見ていきます。

  • __file__について

  • 絶対パスの取得: os.path.abspath

  • ディレクトリの取得: os.path.dirname

  • ファイル名の取得: os.path.basename

関連記事
Pythonのpathlibの今時な使い方
Pythonのbasenameの使い方: パスのファイル名部分を抽出する
Pythonでパスからファイル名を取得する【os.path.basename】
Pythonのglobの賢い使い方【パス収集】

__file__について

__file__とはPythonが持つ特殊変数の1つです。

この変数には現在実行中のスクリプト・ファイルのパスが保存されます。

たとえば/blogsnippets/python/pathget/file.pyというスクリプトを作ります。
スクリプトの中身は↓です。

print(__file__)

このスクリプト・ファイルを実行すると↓のような結果になります。

$ python file.py
/blogsnippets/python/pathget/file.py

__file__はスクリプト・ファイルのパスや、スクリプトの存在するディレクトリを取得したいときに参照されることが多いです。

絶対パスの取得: os.path.abspath

絶対パスの取得には__file__os.path.abspathを組み合わせます。

import os


print(os.path.abspath(__file__))
# /blogsnippets/python/pathget/abspath.py

os.path.abspath()は引数のパスを絶対パスにする関数です。

__file__はすでに絶対パスなんだからabspath()に渡す必要はないのでは?
はい。そうかもしれませんが、念のためabspath()に渡しておきましょう。

↓はabspath()が相対パスを絶対パスに変換する風景です。

print(os.path.abspath('.'))
# /blogsnippets/python/pathget

print(os.path.abspath('./script.py'))
# /blogsnippets/python/pathget/script.py

↑の結果は/blogsnippets/python/pathget/以下でスクリプトを実行したときに得られます。
script.pyは存在しないファイル名ですが、abspath()はそんなことは気にしません。

ディレクトリ名の取得: os.path.dirname

ディレクトリ名を取得したい場合はos.path.dirname()を使います。

import os


print(os.path.dirname(__file__))
# /blogsnippets/python/pathget

__file__から絶対パスを取得し、そこからdirname()でディレクトリ名を取得する処理は、定型文のようによく使われます。
覚えておいて損はないでしょう。

print(os.path.dirname(os.path.abspath(__file__)))
# /blogsnippets/python/pathget

たとえば↑の方法でディレクトリ名を取得して、sys.pathにパスを挿入するという処理もよく行われます。

import os, sys


sys.path.insert(os.path.dirname(os.path.abspath(__file__)))

↑のようにするとスクリプトのあるディレクトリ内のファイルがインポートできるようになります。

ファイル名の取得: os.path.basename

パスのファイル名部分を取得するにはos.path.basename()を使います。

os.path.basename --- 共通のパス名操作 — Python 3.9.4 ドキュメント

関連記事
Pythonでパスからファイル名を取得する【os.path.basename】

__file__のファイル名部分を取得する場合は↓です。

import os


print(os.path.basename(__file__))
# basename.py

おわりに

今回はPythonでスクリプト・ファイルのパスを取得する方法を見てみました。
意外にけっこう使う処理かもしれません。

パスを取得しますか?

パス!(Pass)