モジュールの検索パスのリストは sys.path
Python でモジュールをインポートするには、import モジュール名
のように記述しますが、このときにどのディレクトリのモジュールが検索されるかは、sys.path
変数の値を見ると分かります。
sys.path
は検索パスを示す文字列のリスト (list[str]
) です。
import sys
import pprint
pprint.pprint(sys.path)
['/Users/maku/myapp',
'/opt/homebrew/Cellar/python@3.10/3.10.8/Frameworks/Python.framework/Versions/3.10/lib/python310.zip',
'/opt/homebrew/Cellar/python@3.10/3.10.8/Frameworks/Python.framework/Versions/3.10/lib/python3.10',
'/opt/homebrew/Cellar/python@3.10/3.10.8/Frameworks/Python.framework/Versions/3.10/lib/python3.10/lib-dynload',
'/Users/maku/myapp/.venv/lib/python3.10/site-packages']
sys.path にはどのような検索パスが含まれているか?
sys.path
変数には、自動的に次のようなパスが登録されます。
- 起動したスクリプトと同じディレクトリ(ただし、
python
をインタラクティブモードで起動したときは、カレントディレクトリを示す空文字''
になります) - 環境変数 PYTHONPATH に指定したディレクトリ
- Python インストーラに応じたデフォルトディレクトリ(標準ライブラリのパスなど)
注目すべきは、sys.path
の先頭に追加されるパスで、これは起動されたスクリプトが格納されているディレクトリのパスになっています。
例えば、python ~/myapp/main.py
と実行したときは、自動的に ~/myapp
が検索パスに追加されるため、~/myapp
以下に配置したモジュール (*.py
) をインポートできるようになっています。
import mymod # ~/myapp/mymod.py が検索される
モジュールの検索パスを追加する
PYTHONPATH 環境変数を設定する方法
PYTHONPATH
環境変数に設定したディレクトリパスは、自動的に sys.path
に反映されてモジュールの検索パスとして使われます。
$ export PYTHONPATH=/path/to/lib1:/path/to/lib2:$PYTHONPATH
パスの区切り文字は Linux や macOS ではコロン (:
) ですが、Windows の場合はセミコロン (;
) になることに注意してください(PATH
環境変数の指定方法と同じです)。
C:\> set PYTHONPATH=C:\path\to\lib1;C:\path\to\lib2;%PYTHONPATH%
sys.path 変数を変更する方法
sys.path
変数の内容はスクリプト内で変更可能なので、このリストに任意のパスを追加することで、モジュールの検索パスを動的に拡張できます。
sys.path.append("/path/to/lib1")
sys.path.append("/path/to/lib2")
モジュールやパッケージを ZIP 化したアーカイブのパスを指定することもできます。
sys.path.append("./mypkg.zip")