我的pyenv为3.10.1、系统Python为3.8,为何poetry new默认设3.9?
问题
我用pyenv管理的Python版本是3.10.1,系统默认Python版本为3.8,但执行poetry new poetry-demo命令创建项目后,生成的pyproject.toml文件里Python依赖配置却是:
[tool.poetry.dependencies] python = "^3.9"
我的poetry配置信息如下:
poetry config --list cache-dir = "/home/user/.cache/pypoetry" experimental.new-installer = true experimental.system-git-client = false installer.max-workers = null installer.no-binary = null installer.parallel = true virtualenvs.create = true virtualenvs.in-project = null virtualenvs.options.always-copy = false virtualenvs.options.no-pip = false virtualenvs.options.no-setuptools = false virtualenvs.options.system-site-packages = false virtualenvs.path = "{cache-dir}/virtualenvs" # /home/user/.cache/pypoetry/virtualenvs virtualenvs.prefer-active-python = false virtualenvs.prompt = "{project_name}-py{python_version}"
原因分析
问题根源在virtualenvs.prefer-active-python = false这个配置:
- 当该配置为
false时,Poetry不会优先使用当前shell里激活的Python版本(也就是你通过pyenv切换的3.10.1),而是会扫描系统中所有可用的Python版本,选取它识别到的最高兼容版本,以此作为生成pyproject.toml的版本约束依据。 - 你的系统里大概率存在一个未被pyenv管理的3.9.x版本Python,Poetry检测到这个版本是当前能找到的最高版本,所以自动生成了
^3.9的约束。
解决办法
让Poetry优先使用当前激活的Python版本
执行下面的命令修改配置:poetry config virtualenvs.prefer-active-python true之后再创建新项目,Poetry就会基于当前shell激活的Python版本(比如3.10.1)生成对应的版本约束(比如
^3.10)。创建项目时手动指定Python版本
如果不想修改全局配置,创建项目时直接指定目标版本即可:poetry new poetry-demo --python "^3.10"清理系统中多余的Python版本
检查系统里有没有未被pyenv管理的3.9.x版本,要是用不上就卸载掉,避免Poetry误检测。
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

