poetry install 默认不装 dev-dependencies 是设计使然,因开发依赖被严格隔离在 [tool.poetry.group.dev.dependencies] 中,必须显式执行 poetry install --with dev 才会安装 pytest、black 等工具。

poetry install 默认不装 dev-dependencies,不是 bug,是设计如此;想装必须显式加 --with dev。
为什么 poetry install 没装 pytest、black 这些开发工具?
因为 Poetry 把依赖分组管理,默认只安装 [tool.poetry.dependencies] 下的运行时依赖。dev 工具被归入 [tool.poetry.group.dev.dependencies],属于独立组,不会自动启用。
- 检查
pyproject.toml是否真把pytest写在group.dev.dependencies下,而不是错放在dependencies或拼错 group 名(比如写成dev-dependencies) - 执行
poetry install --with dev是最直接、最推荐的做法 - 别为了图省事把
black加进dependencies—— 这会让它进入生产环境,违反依赖隔离原则 - 验证是否生效:运行
poetry run pytest --version,能输出版本号才说明已装入当前环境
poetry.lock 为什么总在变?怎么锁死它?
poetry lock 的作用是重新解析 pyproject.toml 中声明的所有约束并生成精确版本快照。只要文件内容有改动(哪怕只是改了个 ^2.0 到 ^2.1),它就会更新 poetry.lock —— 这是正常行为,不是失控。
- 想禁止任何变动:先确认
pyproject.toml没被修改,再运行poetry lock --no-update - 团队协作时,
poetry.lock必须提交到 Git;否则每人poetry install都会本地重算,导致环境不一致 - 如果发现某个间接依赖(比如
urllib3)版本跳变,大概率是上游包在 patch 版本里改了兼容性 —— 此时应手动固定:poetry add urllib3==1.26.18 --lock
如何为不同 Python 版本创建/切换 Poetry 环境?
Poetry 默认按 requires-python = "^3.9" 自动选系统中最匹配的解释器,但多数场景需要人工干预,尤其跨版本测试或 CI 调试。
- 用
poetry env use 3.8强制创建并激活 Python 3.8 环境(前提是系统 PATH 里有python3.8或已安装该版本) - Windows 用户若提示找不到 Python,可尝试绝对路径:
poetry env use C:\Python38\python.exe - 验证当前环境:
poetry run python --version或poetry env info - 启用项目级虚拟环境存放(避免全局污染):在
pyproject.toml中设virtualenvs.in-project = true,此时会生成.venv/目录 —— 记得把它加进.gitignore
真正容易被忽略的是:Poetry 不会自动感知你 shell 中通过 pyenv local 或 asdf local 切换的 Python 版本,除非你在执行 poetry install 前已经激活了对应 shell 环境 —— 否则它仍按自己逻辑找解释器。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











