pdm install 后 python main.py 报 modulenotfounderror,是因为 pep 582 不自动生效:pdm.lock 确保安装版本,但 __pypackages__/x.y/lib 需通过 pdm run 或 pythonpath 手动注入 sys.path 才能被 python 发现。

pdm install 后直接 python main.py 会报 ModuleNotFoundError,不是安装失败,而是 PEP 582 的路径注入没生效——必须用 pdm run 启动,或手动配置 PYTHONPATH。
为什么 python main.py 找不到已安装的包?
PEP 582 不是“装完就自动可用”的机制。它把包装进 __pypackages__/X.Y/lib,但 Python 默认不查这个目录。只有满足以下任一条件时,__pypackages__ 才会被加入 sys.path:
-
pdm run python main.py:pdm 自动注入__pypackages__/X.Y/lib到sys.path[0],并加-S参数禁用site-packages - 手动设置环境变量:
PYTHONPATH=__pypackages__/3.11/lib(注意版本号要匹配当前 Python) - 在代码开头硬编码:
import sys; sys.path.insert(0, "__pypackages__/3.11/lib")(不推荐,破坏可移植性)
常见错误现象:ModuleNotFoundError: No module named 'requests',但 pdm list 显示 requests 已安装、pdm.lock 里也有对应条目。
pdm.lock 和 pyproject.toml 各自管什么?
pyproject.toml 是“需求声明”,pdm.lock 才是“执行依据”——这点和 poetry.lock 类似,但行为更严格:
-
pdm add requests:只更新pyproject.toml中的[project.dependencies],然后重新解析依赖树,生成/覆盖pdm.lock -
pdm install:完全忽略pyproject.toml的约束,只读pdm.lock,解压对应哈希的 wheel 到__pypackages__/X.Y/lib -
pdm sync:和install行为一致,但跳过解析环节,适合 CI 场景;默认只装生产依赖(不装[project.optional-dependencies.dev])
删掉 pdm.lock 后直接跑 pdm install 会失败,必须先 pdm add 或 pdm sync --no-lock 触发重锁。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
IDE、pytest、mypy 这些工具怎么接入 PEP 582?
它们不会自动识别 __pypackages__,因为启动时没走 pdm run 注入逻辑。有三种实际可行方式:
- 统一用
pdm run pytest、pdm run mypy .等——最简单,无额外配置 - 在 IDE 设置里指定 Python 解释器为
pdm python(PDM 自带的 wrapper),部分新版 PyCharm / VS Code 可识别该路径并加载__pypackages__ - 手动在 IDE 的运行配置中添加环境变量:
PYTHONPATH=__pypackages__/3.11/lib,并确保解释器版本与路径中3.11一致
注意:VS Code 官方 Python 扩展目前仍不原生支持 PEP 582,即使配置了 PYTHONPATH,LSP(如 pylsp)可能仍无法正确解析类型,建议优先走 pdm run 路径。
CI/CD 中同步依赖的最佳实践
别用 pdm install,改用 pdm sync --production(跳过 dev 依赖)或 pdm sync --no-editable(避免源码链接引发路径问题):
-
pdm sync比install更快,因为它不重新解析依赖树,只按pdm.lock精确还原 - CI 镜像里无需预装 pdm,可用
curl -sSL https://pdm-project.org/install-pdm.py | python3 -快速安装 - 若需锁定 Python 版本,靠
requires-python = ">=3.11"声明在pyproject.toml即可,pdm 不会帮你装 Python,这点和 pyenv/poetry 不同
真正容易被忽略的是:PEP 582 的隔离性依赖于解释器启动方式,而不是项目目录是否存在 __pypackages__。哪怕目录结构完整,只要没触发路径注入,Python 就当它不存在。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










