タイトル: プログラム実行時のパスを取得
SEOタイトル: Pythonで実行時のパスを取得する方法|__file__・os.getcwd・pathlib
Pythonで実行時のパスを取得するには、用途に応じて「カレントディレクトリ」ならos.getcwd()、「スクリプト自身のファイルパス」ならos.path.abspath(__file__)、「スクリプトが置かれているディレクトリ」ならos.path.dirname(os.path.abspath(__file__))を使うのが基本です。これらは取得対象がそれぞれ異なるため、目的に合った方法を選ぶことが重要です。
| この記事の要点 |
|---|
|
目的別の早見表
まず「何のパスが欲しいのか」をはっきりさせると、選ぶべき方法が決まります。以下から目的に近いものを選んでください。
| 取得したいもの | 取得方法 |
|---|---|
| コマンドを実行したカレントディレクトリ | os.getcwd() |
| 実行中のスクリプト自身のパス | os.path.abspath(__file__) |
| スクリプトが置かれているディレクトリ | os.path.dirname(os.path.abspath(__file__)) |
| Pythonインタプリタ本体のパス | sys.executable |
| pathlibでスクリプトのあるディレクトリ | Path(__file__).resolve().parent |
以下の解説では、次のディレクトリにスクリプトが置かれているものとして説明します。
|
C:\aaa\bbb\script\main.py |
カレントディレクトリを取得する(os.getcwd)
カレントディレクトリ(カレントワーキングディレクトリ)とは、プログラムを起動したときの「作業ディレクトリ」です。一般的には、コマンドラインで python コマンドを実行したときの、ターミナルが居たディレクトリになります。これを取得するには os.getcwd()(get current working directory)を使います。
|
import os cwd = os.getcwd() print(cwd) # 例: C:\work (pythonを実行した場所) |
注意したいのは、カレントディレクトリはスクリプトの置き場所とは無関係だという点です。たとえば C:\work で python C:\aaa\bbb\script\main.py と実行した場合、カレントディレクトリは C:\work になり、スクリプトのある C:\aaa\bbb\script にはなりません。「スクリプトの場所が欲しい」場合に os.getcwd() を使うのは誤りになりやすいため、次の方法を検討してください。
スクリプト自身のパスを取得する(__file__)
実行中のスクリプトファイル自身のパスは、特殊変数 __file__ で取得できます。ただし __file__ に入っている値は、Pythonの実行方法によって相対パスのことも絶対パスのこともあるため、確実に絶対パスが欲しい場合は os.path.abspath() で変換します。
|
import os print(__file__) # 相対パスのこともある(実行方法に依存) filepath = os.path.abspath(__file__) print(filepath) # C:\aaa\bbb\script\main.py |
os.path.abspath(__file__) としておけば、どこから実行しても スクリプト自身の絶対パスが得られます。設定ファイルやデータファイルをスクリプトと同じ場所に置いて読み込みたい、といった場面で土台になる値です。
スクリプトのあるディレクトリを取得する(dirname)
「スクリプトと同じフォルダにあるファイルを開きたい」という用途では、ファイルそのものではなく、それが置かれているディレクトリが必要になります。os.path.dirname() でディレクトリ部分だけを取り出します。
|
import os script_dir = os.path.dirname(os.path.abspath(__file__)) print(script_dir) # C:\aaa\bbb\script # 同じフォルダの data.txt のパスを組み立てる data_path = os.path.join(script_dir, "data.txt") print(data_path) # C:\aaa\bbb\script\data.txt |
このように os.path.dirname(os.path.abspath(__file__)) で得たディレクトリと os.path.join() を組み合わせれば、カレントディレクトリがどこであっても、スクリプトを基準とした正しいパスを組み立てられます。これは相対パスのトラブルを避ける定番の書き方です。
実行中のPythonインタプリタのパスを取得する(sys.executable)
スクリプトを実行しているPythonインタプリタ本体(python実行ファイル)の場所を知りたい場合は、sys.executable を使います。複数のPythonや仮想環境を併用していて、「いま動いているのはどのPythonか」を確認したいときに役立ちます。
|
import sys print(sys.executable) # 例: C:\Python312\python.exe # 仮想環境なら venv 内の python を指すことが多い |
pathlibでの書き方(Path)
Python 3.4以降では、パスをオブジェクトとして扱う pathlib モジュールが標準で使えます。文字列の連結を os.path.join で行う代わりに、/ 演算子で直感的に書ける点が特徴です。スクリプトのあるディレクトリは Path(__file__).resolve().parent で取得します。
|
from pathlib import Path # スクリプト自身の絶対パス filepath = Path(__file__).resolve() # スクリプトのあるディレクトリ script_dir = Path(__file__).resolve().parent # 同じフォルダの data.txt data_path = script_dir / "data.txt" # カレントディレクトリ cwd = Path.cwd() |
resolve() は os.path.abspath() に相当し、相対パスを絶対パスに変換します。parent がディレクトリ部分(os.path.dirname 相当)、Path.cwd() が os.getcwd() 相当です。新しく書くコードでは pathlib が読みやすくおすすめです。
カレントディレクトリとスクリプトの場所の違い(重要)
つまずきやすい最大のポイントが、「カレントディレクトリ」と「スクリプトの場所」は別物だということです。両者が一致することもありますが、それは保証されません。
- カレントディレクトリ(
os.getcwd()) … プログラムを起動したときの作業ディレクトリ。実行する人がどこから起動したかで変わります。 - スクリプトの場所(
__file__) ….pyファイルが実際に保存されている場所。ファイルを動かさない限り変わりません。
たとえば C:\work でターミナルを開き、python C:\aaa\bbb\script\main.py と実行すると、以下のように値が分かれます。
|
# C:\work でこのコマンドを実行した場合 # > python C:\aaa\bbb\script\main.py import os print(os.getcwd()) # C:\work ←起動した場所 print(os.path.dirname(os.path.abspath(__file__))) # C:\aaa\bbb\script ←スクリプトの場所 |
このように、同じファイルでも起動場所が変わればカレントディレクトリは変わるのに対し、スクリプトの場所は変わりません。「設定ファイルやデータをスクリプトの隣に置いて読み込む」ような処理でカレントディレクトリを基準にしてしまうと、起動場所によってファイルが見つからなくなります。この場合は __file__ を基準にするのが正解です。
比較表(用途と取得方法)
| 用途 | 取得方法(os系) | 取得方法(pathlib系) | 起動場所で変わるか |
|---|---|---|---|
| カレントディレクトリ | os.getcwd() |
Path.cwd() |
変わる |
| スクリプト自身のパス | os.path.abspath(__file__) |
Path(__file__).resolve() |
変わらない |
| スクリプトのディレクトリ | os.path.dirname(os.path.abspath(__file__)) |
Path(__file__).resolve().parent |
変わらない |
| Pythonインタプリタ本体 | sys.executable |
— | 変わらない |
落とし穴と注意点
| つまずきやすいポイント |
|---|
|
よくある質問(FAQ)
Q. スクリプトと同じフォルダにあるファイルを確実に読み込むには?
A. カレントディレクトリに頼らず、スクリプトの場所を基準にするのが確実です。script_dir = os.path.dirname(os.path.abspath(__file__)) でディレクトリを求め、os.path.join(script_dir, "ファイル名")(またはpathlibの Path(__file__).resolve().parent / "ファイル名")でパスを組み立ててから開いてください。これなら、どこから実行しても同じファイルを指します。
Q. __file__ と os.getcwd() は何が違うの?
A. __file__ は「いま実行している .py ファイルが置かれている場所」を表し、os.getcwd() は「プログラムを起動したときの作業ディレクトリ」を表します。前者はファイルを移動しない限り変わりませんが、後者は起動する場所によって変わります。目的に応じて使い分けてください。
Q. 仮想環境(venv)で動かしているPythonのパスを知りたい。
A. sys.executable を表示すると、実行中のPython本体のパスが分かります。仮想環境を有効化して実行していれば、多くの場合その仮想環境内の python を指します。「意図したPython/環境で動いているか」を確認したいときに便利です。