この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:3
ページ更新者:atom
更新日時:2026-06-12 15:49:49

タイトル: プログラム実行時のパスを取得
SEOタイトル: Pythonで実行時のパスを取得する方法|__file__・os.getcwd・pathlib

Pythonで実行時のパスを取得するには、用途に応じて「カレントディレクトリ」ならos.getcwd()、「スクリプト自身のファイルパス」ならos.path.abspath(__file__)、「スクリプトが置かれているディレクトリ」ならos.path.dirname(os.path.abspath(__file__))を使うのが基本です。これらは取得対象がそれぞれ異なるため、目的に合った方法を選ぶことが重要です。

この記事の要点
  • カレントディレクトリ(コマンドを実行した場所)を取得するなら os.getcwd()
  • 実行中のスクリプト自身のパス__file__。絶対パスにするには os.path.abspath(__file__)
  • スクリプトが置かれているディレクトリos.path.dirname(os.path.abspath(__file__))
  • 実行中のPythonインタプリタ本体のパスは sys.executable
  • pathlib を使うと Path(__file__).resolve().parent のように簡潔に書ける。
  • カレントディレクトリとスクリプトの場所は別物。同じ値とは限らない点に注意。

 

目的別の早見表

まず「何のパスが欲しいのか」をはっきりさせると、選ぶべき方法が決まります。以下から目的に近いものを選んでください。

取得したいもの 取得方法
コマンドを実行したカレントディレクトリ 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:\workpython 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 変わらない

 

落とし穴と注意点

つまずきやすいポイント
  • カレント≠スクリプト位置: os.getcwd() は起動場所を返す。スクリプトの隣のファイルを開きたいなら必ず __file__ を基準にする。
  • 対話モードでは __file__ が無い: Pythonの対話シェル(REPL)に直接コードを打ち込んだ場合、__file__ は定義されておらず NameError になる。__file__ はファイルとして実行したときに使えるものと考える。
  • 相対パスの罠: open("data.txt") のように相対パスでファイルを開くと、基準になるのはカレントディレクトリであって、スクリプトの場所ではない。起動場所が変わると読み込みに失敗するため、os.path.join(script_dir, "data.txt") のように絶対パスへ組み立てるのが安全。
  • __file__ が相対パスのことがある: 実行方法によって __file__ が相対パスになる場合があるので、確実に絶対パスが欲しいときは os.path.abspath() または resolve() を通す。

 

よくある質問(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/環境で動いているか」を確認したいときに便利です。