はじめに
開発をしているとよく目にするsys.path
について、きちんと理解できていなかったので学習メモです。
sys.path
とは
Pythonはimport
文を使ってモジュールを読み込みます。
その際、Pythonは「どのフォルダの中を探せばいいのか?」をリストで管理しています。
このリストがsys.path
です。
import sys
print(sys.path)
実行結果の例
['/Users/user/project',
'/Users/user/.pyenv/versions/3.10/lib/python3.10',
'/Users/user/.pyenv/versions/3.10/lib/python3.10/site-packages']
このようにPythonはsys.pathに書かれたフォルダの中からパッケージを探します。
sys.path
が作成・追記されるタイミング
1. Pythonの起動時
-
python
コマンドで対話型シェルを起動時 - Pythonファイルを実行時
-
python -m module
でモジュールを実行時
pythonを起動すると自動的にsys.path
が作成され、以下のような情報を元にリストが作成されます。
- スクリプトのあるディレクトリ(現在のディレクトリ)
- 標準ライブラリのディレクトリ(例: /usr/lib/python3.10)
-
site-packages
のディレクトリ(インストールされたパッケージの保存場所) - (設定されている場合のみ)
PYTHONPATH
環境変数に指定されたディレクトリ
2. PYTHONPATH
環境変数が設定されたとき
PYTHONPATH
環境変数を設定すると、そのディレクトリもsys.path
に追加されます。
3. sys.path.append()
で手動追加したとき
Pythonのスクリプト内でsys.path.appen()
を使うと、指定したディレクトリがsys.path
に追加されます。
import sys
sys.path.append("/path/to/custom/module")
sys.path
を確認するといいケース
1. NotModuleFoundエラーが発生したとき
import mymodule #ModuleNotFoundError
このようなエラーが発生したときは、sys.path
を確認し、対象モジュールのディレクトリがsys.path
に含まれているかチェックしましょう。
import sys
print(sys.path)
2. カスタムモジュールを正しくインポートできないとき
プロジェクトの独自モジュールをインポートしようとしたとき、sys.path
にそのディレクトリが含まれているか確認します。
3. パッケージのインストール後にimport
できないとき
pip install
したはずのパッケージがimport
できない場合、sys.path
にsite-packages
のディレクトリが含まれているかを確認します。
import sys
print([p for p in sys.path if "site-packages" in p])