DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

Poetry 当前 Python 能运行,version solving 却失败:看声明的支持范围

Poetry 按项目声明的 Python 范围求解,而不只看当前解释器。根据真实兼容范围修改约束,区分发行元数据与锁定范围,避免用条件依赖跳过必需功能。

当前使用 Python 3.11,依赖也支持这个版本,Poetry 安装却报 version solving failed,并指出项目的 Python 范围包含依赖不支持的版本。先检查 pyproject.toml 声明的整个支持范围,不要只看当前虚拟环境。

例如项目写 python = "^3.10",Poetry 按 >=3.10,<4.0 理解。如果所选依赖版本仅支持 >=3.8,<3.13,当前 3.11 虽然满足条件,项目宣称支持的 3.13 到 4.0 之前仍与依赖冲突。Poetry 需要为声明范围求解,而不只是为当前解释器找到一次可安装组合。

从错误里的三个范围判断

核对项目 Python 声明、当前解释器版本和失败依赖的 Requires-Python。错误通常会直接指出无法满足的子区间,应保留完整求解信息,并确认失败的是哪个包版本及哪层依赖。

PyInstaller 6.5.0 的 <3.13 上界可用于理解这个历史场景,但不代表当前所有 PyInstaller 版本都使用同一范围。升级或更换依赖时,应检查目标版本的真实声明,以及项目的兼容验证结果。

如果当前解释器本身也不在项目声明范围内,那还需要处理运行环境;但当前环境已经满足两个范围时,只更换为另一个同样满足条件的 Python,通常不会修复整个声明范围的冲突。

项目确实只支持较窄范围,就修正声明

若项目当前明确支持 Python 3.10 到 3.12,可以将相应范围写准确。Poetry 1.8 等采用 tool.poetry.dependencies 的项目,可在现有表中调整该项,其他依赖保持原配置:

[tool.poetry.dependencies]
python = ">=3.10,<3.13"

这是说明范围的片段,不是完整项目文件。不要覆盖整份 pyproject.toml,也不要为了一个错误把项目的真实最低版本或其他依赖删掉。

支持范围是对使用者的兼容承诺,应由项目实际条件决定。不能只为让求解器通过就限制到当前机器的精确补丁版本,或把尚未验证的更高版本写成已经支持。

Poetry 2.x 区分包元数据与锁定范围

当前 Poetry 支持 project.requires-python,也支持在 tool.poetry.dependencies 中补充锁定用的 Python 范围。两处同时配置时,锁定范围必须是包元数据允许范围的子集。

若发行包与运行项目实际支持范围相同,可保持两者一致,以下仅展示有关字段:

[project]
requires-python = ">=3.10,<3.13"

[tool.poetry.dependencies]
python = ">=3.10,<3.13"

项目若有充分依据让发行元数据保留更宽范围、只为特定开发或部署流程收窄锁定范围,可以按其设计使用不同上界,但这不证明较高 Python 版本已经可运行所有必需依赖。核对构建后的包元数据,避免只修改锁定配置而继续向用户承诺实际上不成立的兼容性。

project.requires-python 使用对应元数据的版本约束语法,不能把 ^3.10 原样复制进去。旧版 Poetry 项目也不要未经迁移直接改为新版字段,先核对工具版本和现有配置结构。

依赖真的只在部分版本需要,才使用条件

某个包仅承担特定 Python 版本的兼容功能时,可以给该依赖添加 Python 条件或 marker。当前 Poetry 支持按 Python 范围限制依赖,例如在 tool.poetry.dependencies 的该包声明中使用 python 字段。

这会让其他版本不安装该依赖,而不是让不兼容的包突然兼容。如果打包流程在每个支持版本都必须用 PyInstaller,不能通过 marker 悄悄把它排除,再称整个流程已经受支持。选择条件前先确认代码与构建入口有没有相应分支。

必须支持更高 Python 的项目,应寻找支持目标版本的依赖版本或替代方案,并检查其他依赖的范围和功能兼容性。绕过声明安装只验证了当前环境,不会生成可靠的跨版本锁定结果。

保留锁文件,验证整个支持范围

修改前保存 pyproject.toml、锁文件和 Poetry 版本。按项目当前工具的流程重新求解与安装,核对锁文件差异;不要首先删除锁文件再无条件更新全部包,否则会把范围修正和大量依赖升级混在一起。

在项目宣称支持的代表性 Python 版本中,由既有 CI 或测试入口验证安装和实际功能,尤其检查打包工具、可选依赖及条件路径。成功标准包括求解不再因同一范围失败,锁定与发行元数据符合设计,应用和构建功能正常。

回退时一起恢复已保存的声明与锁文件,并在受控环境恢复对应依赖。只还原文件不会撤销当前虚拟环境里已更新的包;环境恢复与兼容承诺也需要一并核对。