🐍

PDM を使用したプロジェクトで ModuleNotFoundError が発生する

2023/02/18に公開

事象

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