Pythonでスクリプトのパスを扱う際に登場する特殊な変数が __file__
です。
この __file__
は、実行中のPythonスクリプトの「ファイルパス」を自動的に保持してくれる組み込み変数です。
この記事では __file__
の意味や使い方、活用シーン、注意点までをわかりやすく丁寧に解説します。
file とは?
__file__
は、実行されているPythonファイル自身の「パス」を文字列として格納している特殊変数です。
たとえば main.py
というファイルが /home/user/project/main.py
にあるとき、このファイル内で __file__
を出力すれば、そのままその絶対パス(または相対パス)が取得できます。
Pythonがそのスクリプトをどこから実行しているかを知るために、__file__
は非常に便利です。
基本的な使い方
まずは、__file__
の値をそのまま表示する基本的なコードを見てみましょう。
1 2 |
print(__file__) |
このコードを main.py
に書いてターミナルで実行すると、次のように表示されます。
1 2 |
/home/user/project/main.py |
このように、実行中のスクリプトのパスが文字列で得られるため、
「このスクリプトと同じディレクトリにあるファイルを読み込みたい」
といった場面で活躍します。
具体例:実行中スクリプトのディレクトリを取得
__file__
と os.path.dirname()
を組み合わせることで、スクリプトが存在するディレクトリを簡単に取得できます。
1 2 3 4 5 |
import os script_dir = os.path.dirname(__file__) print(script_dir) |
このコードでは:
__file__
によってファイルのフルパスを取得し、os.path.dirname()
でディレクトリ部分だけを取り出します
設定ファイルやテンプレートファイルを同じ場所に置きたいときなどに便利です。
具体例:同じ場所にあるファイルを開く
__file__
を使えば、実行中のスクリプトと同じフォルダにあるファイルを確実に指定できます。
1 2 3 4 5 6 7 8 9 10 |
import os base_dir = os.path.dirname(__file__) file_path = os.path.join(base_dir, "data.txt") with open(file_path, "r") as f: content = f.read() print(content) |
このようにすることで、カレントディレクトリの変更やOSの違いによらず、正確に目的のファイルへアクセスできます。
注意点
__file__ が使えない場面もある
__file__
はPythonスクリプトをファイルとして実行したときには利用できますが、以下のような状況では使えない場合があります。
- 対話モード(REPL)
python -c
でワンライナーを実行したとき- 一部のパッケージ化ツールでビルドされたとき(PyInstallerなど)
このような場面では __file__
が未定義だったり、期待した値を返さなかったりすることがあります。
そのため、使う前に __file__
の有無をチェックするなどの対策が必要な場合もあります。
相対パスで返される場合がある
__file__
の値は、必ずしも絶対パスとは限りません。
たとえば次のようにカレントディレクトリからの相対パスになることがあります。
1 2 3 |
$ python script/main.py # 結果: script/main.py |
これを確実に絶対パスに変換したい場合は、os.path.abspath()
を使います。
1 2 3 4 5 |
import os abs_path = os.path.abspath(__file__) print(abs_path) |
まとめ
今回は __file__
の意味と使い方について詳しく紹介しました。
__file__
は実行中のスクリプトファイルのパスを表す特殊変数- スクリプトの場所を基準に、ファイルの読み書きが可能になる
os.path.dirname(__file__)
と組み合わせることでディレクトリを取得できる- 対話モードなど一部の環境では使えないこともあるので注意
- 絶対パスに変換するには
os.path.abspath(__file__)
を使う
ファイルパスを安全に扱いたい場面では __file__
を使うことで、環境に依存しない柔軟なコードが書けるようになります。
ぜひマスターしておきましょう!