直接运行python main.py找不到包,是因为PDM启用PEP 582后依赖装入__pypackages__/3.11/lib,但系统Python的sys.path未包含该路径;必须用pdm run python main.py才能自动注入路径并正确加载包。

直接运行 python main.py 找不到包?这是 PDM 最常被卡住的地方
不是代码写错了,是 Python 根本没看到你装的包。PDM 默认启用 PEP 582 模式,所有依赖都放进项目根目录下的 __pypackages__/3.11/lib(版本号随你用的 Python 变),但系统 Python 启动时 sys.path 里压根没有这个路径。
必须走 pdm run 这一层:它会自动把 __pypackages__/X.Y/lib 插入 sys.path 开头,优先于全局 site-packages。
-
pdm run python main.py✅ 正确入口 -
python main.py❌ 纯系统解释器,无视__pypackages__ - IDE(如 VS Code)要手动选
pdm python list返回的解释器路径,并把__pypackages__/3.11/lib加进PYTHONPATH或设为 Sources Root
pdm add 和 pdm install 完全不是一回事
新手容易以为 pdm add requests 就等于“装上了”,其实它只改 pyproject.toml 并更新 pdm.lock,不碰 __pypackages__ 目录。真正解压安装发生在 pdm install 阶段——它读 lockfile,按锁定版本落地到磁盘。
-
pdm add requests→ 写入[project.dependencies],生成/更新pdm.lock -
pdm install→ 按pdm.lock把包解压进__pypackages__/3.11/lib -
pdm install --prod→ 跳过[project.optional-dependencies.dev],只装生产依赖 - CI 场景推荐
pdm sync:跳过解析,直接按 lockfile 安装,更快更确定
让 pytest、mypy、black 这些工具正常工作
它们不是 Python 脚本,而是独立可执行文件,默认不走 pdm run,所以会找不到本地包或 dev 依赖。
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
正确做法不是往 PATH 里塞路径,而是统一用 pdm run 包一层:
-
pdm run pytest tests/✅ 自动加载__pypackages__+ dev 依赖 -
pdm run mypy src/✅ 同理 - 在
pyproject.toml的[tool.pdm.scripts]里定义别名:test = "pytest tests/",然后pdm run test -
black若被pdm add --dev black安装,它本身是可执行脚本,pdm run black .就能直接调用,无需全局安装
Linux 下迁移老项目,pdm init 不会自动导入 requirements.txt
这是个隐蔽坑:对已有 requirements.txt 或 setup.py 的项目执行 pdm init,它只会生成空的 pyproject.toml,不会读取或转换任何依赖。
必须手动补全,或者用其他方式导入:
- 先
pdm init,再pdm add逐个加依赖(适合小项目) - 用
pdm import requirements.txt(注意:需确认该命令是否已启用,部分版本需插件支持) - 更稳妥的做法是:先用
pip install -r requirements.txt在临时 venv 中验证依赖能跑通,再对照整理进pyproject.toml - PEP 621 要求依赖声明在
[project.dependencies]下,格式是"requests>=2.28.0",不是requests==2.28.0那种 pip freeze 输出风格
PEP 582 的本质是改 Python 导入机制,不是“换个地方放 venv”。一旦习惯 pdm run 前缀,就再也回不去手动激活虚拟环境了——但忘了它,连 import 都会报错,这点比任何文档都难调试。

















