Poetry 没有使用正确版本的 Python

P4n*_*1n0 15 python virtualenv pyenv python-poetry

我最近安装了 Pyenv 和 Poetry,想创建一个新的 Python 3.8 项目。我已经将python的globallocal版本设置为3.8.1使用适当的 Pyenv 命令(pyenv global 3.8.1例如)。当我pyenv version在终端中运行时,输出3.8.1.符合预期。

现在,问题是当我用 Poetry( poetry new my-project)创建一个新的 python 项目时,生成的pyproject.toml文件用 python 2.7 创建了一个项目:

[tool.poetry]
name = "my-project"
version = "0.1.0"
description = ""
authors = ["user <user@email.com>"]

[tool.poetry.dependencies]
python = "^2.7"

[tool.poetry.dev-dependencies]
pytest = "^4.6"

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"
Run Code Online (Sandbox Code Playgroud)

Poetry 似乎默认回 Python 的系统版本。如何更改它以使用与 Pyenv 一起安装的版本?

编辑

我使用的是 MacOS,它与 Python 2.7 捆绑在一起。我认为这可能会导致这里的一些问题。我已经使用 Pyenv 再次重新安装了 Python 3.8,但是当我点击时Poetry install出现以下错误:

The currently activated Python version 2.7.16 is not supported by the project (^3.8).
Trying to find and use a compatible version.

[NoCompatiblePythonVersionFound]
Poetry was unable to find a compatible version. If you have one, you can explicitly use it via the "env use" command. 
Run Code Online (Sandbox Code Playgroud)

我应该使用 Pyenv 为项目明确创建一个环境,还是项目在运行后应该能够访问正确的 Python 版本pyenv local 3.8.1.?当我做后者时,没有任何变化,我仍然遇到相同的错误。

Rob*_*byB 38

我对此的解决方案。

首先用这个命令查看情况

poetry env list
Run Code Online (Sandbox Code Playgroud)

如果您有这样的输出:project_name-QI_LjVaV-py3.9(已激活)

你可能想摆脱这个环境。

所以你首先要进行“停用”:

deactivate
Run Code Online (Sandbox Code Playgroud)

然后是“删除”之后:

poetry env remove project_name-QI_LjVaV-py3.9
Run Code Online (Sandbox Code Playgroud)

现在同样的命令:

poetry env list
Run Code Online (Sandbox Code Playgroud)

不应该返回任何内容。

然后你就可以:

which python3
Run Code Online (Sandbox Code Playgroud)

并且,如果版本没问题,您可以使用与 python 路径完全相同的输出来告诉诗歌(示例):

poetry env use /usr/bin/python3
Run Code Online (Sandbox Code Playgroud)

再做一次

poetry env info 
Run Code Online (Sandbox Code Playgroud)

确保使用的是你想要的Python版本。

您可以继续

poetry install
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!在尝试了许多其他解决方案一个小时后,这为我解决了这个问题。我认为删除创建的环境是关键。 (2认同)
  • @SaTa正确,诗歌文档指出:“如果已经在`{cache-dir}/virtualenvs`下为项目创建了虚拟环境,则将此变量设置为“true”将不会导致“poetry”创建或使用本地虚拟环境。为了使此设置对已处于该状态的项目生效,您必须删除位于“{cache-dir}/virtualenvs”中的虚拟环境文件夹。https://python-poetry.org/docs/configuration/#virtualenvsin-project (2认同)

Jan*_*Jan 32

你可以使用以下命令为诗歌指定一个显式的 python 可执行文件

poetry env use <path to python executable>
Run Code Online (Sandbox Code Playgroud)

这对我有用。


Jac*_*ing 17

在我的机器上,我可以通过重新安装 Poetry 来修复“项目不支持当前激活的 Python 版本”错误:

curl -sSL https://install.python-poetry.org | python3 - --uninstall
curl -sSL https://install.python-poetry.org | python3 -
Run Code Online (Sandbox Code Playgroud)

之后,poetry能够找到安装的正确版本pyenv


小智 11

pyproject.toml 用于定义项目的所有依赖项,包括支持的 Python 版本。

你抱怨的那句话只是说项目支持的python版本是python2.7或更高版本,这与你用pyenv安装的python版本无关。

python = "^2.7"
Run Code Online (Sandbox Code Playgroud)

如果要更新项目支持的python版本,可以直接编辑文件,运行poetry update.


如果你想使用多个版本的 python,你需要确保诗歌使用的是你正在使用的 python 版本的正确依赖项。要更改诗歌正在使用的特定版本,您应该使用poetry env

  • poetry env list 显示python诗歌可以使用的版本
  • poetry env use <python> 切换诗歌以使用该版本。

例如,在我的机器上,诗歌安装了 3 个虚拟环境,并且正在使用与 python3.6 相关的一个:

? poetry env list
sipy-a9sqc5pb-py3.6 (Activated)
sipy-a9sqc5pb-py3.7
sipy-a9sqc5pb-py3.8
Run Code Online (Sandbox Code Playgroud)

我不确定这些虚拟环境如何与 pyenv 使用的 shiv 进行交互,但他们的文档有一个与之相关的部分

管理虚拟环境

有一个名为 pyenv-virtualenv 的 pyenv 插件,它具有各种功能,可帮助 pyenv 用户管理由 virtualenv 或 Anaconda 创建的虚拟环境。因为那些虚拟环境的 activate 脚本依赖于用户交互式 shell 的 $PATH 变量,它会拦截 pyenv 的 shim 风格的命令执行钩子。如果您有使用这些虚拟环境的计划,我们建议您也安装 pyenv-virtualenv。

  • “Poetry 应该管理所有的 Python 依赖项,这样就不需要使用 pyenv。”——pyenv 不适用于_依赖项_。它管理_Python本身_的版本。诗歌本身就是这样做的吗? (2认同)
  • 我不知道该命令在去年是否发生了变化,但我认为当前的命令是 `poetry env use python3.8` 。资料来源:https://web.archive.org/web/20210130151158/https://python-poetry.org/docs/managing-environments/ (2认同)

P4n*_*1n0 8

好吧,我想出了问题。有点尴尬,pyenv shell 3.8.1在运行任何其他命令之前我没有运行。现在一切正常。谢谢大家的努力。

  • 有趣的是,我需要这样做,即使我在目录中有一个具有正确版本的“.python-version”。 (4认同)
  • 这是我遇到的大多数问题的解决方案。(令人尴尬的是,每次我这样做时,我都需要谷歌搜索这个答案!)谢谢。 (3认同)

Ben*_*rth 7

就我而言,我必须删除并重新创建诗歌使用的virtualenv 。python = ">=3.6.2 <3.7"这是因为我在创建 virtualenv 后添加了 python 版本限制(例如)。

脚步

  • 删除原来的:运行poetry env remove myApp-XkghI9p6-py3.6
  • 运行任何诗歌步骤来创建它,或运行poetry shell,并确认poetry run python --version是正确的版本。