Open1

[Python] sys.pathとPYTHONPATHを理解する

mocknmockn

sys.path と PYTHONPATH

背景

Pythonで単体テスト(pytest)を実行したときに、パス設定の問題でModuleNotFoundエラーに苦しまされたため、sys.pathとPYTHONPATHについてちゃんと理解しようと思った。

sys.pathとは

モジュールを検索するパスを示す文字列のリスト。 PYTHONPATH 環境変数と、インストール時に指定したデフォルトパスで初期化されます。

https://docs.python.org/ja/3/library/sys.html#sys.path

PYTHONPATHとは

モジュールファイルのデフォルトの検索パスを追加します。この環境変数のフォーマットはシェルの PATH と同じで、 os.pathsep (Unix ならコロン、 Windows ならセミコロン) で区切られた1つ以上のディレクトリパスです。存在しないディレクトリは警告なしに無視されます。

https://docs.python.org/ja/3/using/cmdline.html#envvar-PYTHONPATH

pytestとの関連

  • python3.2以前では、自作のモジュールについては各階層に空の__init__.pyを配置する必要がある。
  • __init.py__はルートディレクトリには配置しない。
  • python 3.3以降はそもそも__init__.pyの配置は不要。

https://peps.python.org/pep-0420/
https://shino-tec.com/2019/04/21/init-py-necessity/

参考

https://docs.python.org/ja/3/tutorial/modules.html
https://zenn.dev/ama_c/articles/43bd4171a9855d
https://note.nkmk.me/python-import-module-search-path/