诗歌没有使用 Python 的正确版本

Poetry doesn't use the correct version of Python

我最近安装了 Pyenv 和 Poetry,想创建一个新的 Python 3.8 项目。我已经使用适当的 Pyenv 命令(例如 pyenv global 3.8.1)将 python 的 globallocal 版本设置为 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"

好像诗歌默认回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. 

我应该使用 Pyenv 明确地为项目创建一个环境,还是项目应该能够在 运行ning pyenv local 3.8.1. 之后访问正确的 Python 版本?当我做后者时,什么都没有改变,我仍然得到同样的错误。

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

你抱怨的那一行只是说项目支持的 python 版本是 python2.7 或更高版本,这与你的 python 版本无关已经安装了 pyenv。

python = "^2.7"

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


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

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

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

关联的那个
↪ poetry env list
sipy-a9sqc5pb-py3.6 (Activated)
sipy-a9sqc5pb-py3.7
sipy-a9sqc5pb-py3.8

我不确定这些虚拟环境如何与 pyenv 使用的 shivs 交互,但它们 docs 有一个相关部分

Managing Virtual Environments

There is a pyenv plugin named pyenv-virtualenv which comes with various features to help pyenv users to manage virtual environments created by virtualenv or Anaconda. Because the activate script of those virtual environments are relying on mutating $PATH variable of user's interactive shell, it will intercept pyenv's shim style command execution hooks. We'd recommend to install pyenv-virtualenv as well if you have some plan to play with those virtual environments.

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

虽然这个问题已经解决了,但我还是为再次遇到这个问题的人写这篇文章。 在所有尝试之后,我的 python -V 总是导致 2.7,并且没有讨论提到 运行 pyenv shell(令我惊讶!) 将 pyenv 添加到路径

$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bash_profile

在我的例子中,我必须将它添加到 .bashrc 而不是 bash_profile。 https://ggkbase-help.berkeley.edu/how-to/install-pyenv/

成功了!

在我的例子中,环境在某种程度上被弄乱了,诗歌无法正确激活 virtualenv。

尝试使用不同的 shell:也许是 sh 或 zsh。如果在 shell 中一切正常,这证明您的环境和我的环境一样混乱:)

在两个 shell 中使用此命令:

$ env

并尝试找出差异

您可以从 pyproject.toml 文件中删除 python 版本,然后 运行 Poetry install

对我有用的是 运行 python3.8 -m poetry install

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

curl -sSL https://install.python-poetry.org | python3 - --uninstall
curl -sSL https://install.python-poetry.org | python3 -

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

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

步骤

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

您可以使用

为诗歌指定明确的python可执行文件
poetry env use <path to python executable>

这对我有用。