🐍
PDM を使用したプロジェクトで ModuleNotFoundError が発生する
事象
Python のパッケージマネージャー PDM を使ったプロジェクトで、プログラム実行時に ModuleNotFoundError
が発生。
例えば typer モジュールを import している main.py を実行すると次のような出力になる。
import typer
def main(name: str):
print(f"Hello {name}")
if __name__ == "__main__":
typer.run(main)
$ python main.py foo
Traceback (most recent call last):
File "/Users/hamakou108/some-project/main.py", line 1, in <module>
import typer
ModuleNotFoundError: No module named 'typer'
なお virtualenv は使用せず、 PEP 582 に沿ってプロジェクトディレクトリに __pypackages__
を作成する方式でパッケージファイルを管理している。
環境
- macOS: Ventura 13.0.1
- Python: 3.11.2
- PDM: 2.4.5
解決策
pdm run
付きで Python を実行する。
$ pdm run python main.py foo
Hello foo!
どうやら pdm run
を実行した際に sys.path
に __pypackages__
へのパスを追加する処理が行われ、 PDM によってインストールされたモジュールの検索が可能になるらしい。
$ python -c "import sys; print(sys.path)" # 見やすいように整形しているが、実際には1行で出力される
[
'',
'/Users/hamakou108/.asdf/installs/python/3.11.2/lib/python311.zip',
'/Users/hamakou108/.asdf/installs/python/3.11.2/lib/python3.11',
'/Users/hamakou108/.asdf/installs/python/3.11.2/lib/python3.11/lib-dynload',
'/Users/hamakou108/.asdf/installs/python/3.11.2/lib/python3.11/site-packages'
]
$ pdm run python -c "import sys; print(sys.path)"
[
'',
'/Users/hamakou108/some-project',
'/Users/hamakou108/.asdf/installs/python/3.11.2/lib/python311.zip',
'/Users/hamakou108/.asdf/installs/python/3.11.2/lib/python3.11',
'/Users/hamakou108/.asdf/installs/python/3.11.2/lib/python3.11/lib-dynload',
'/Users/hamakou108/some-project/__pypackages__/3.11/lib'
]
Discussion