【问题标题】:Poetry doesn't use the correct version of Python诗歌没有使用正确版本的 Python
【发布时间】:2020-05-05 16:40:15
【问题描述】:

我最近安装了 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"

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. 

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

【问题讨论】:

标签: python virtualenv pyenv python-poetry


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      在我的情况下,环境以某种方式搞砸了,诗歌未能正确激活 virtualenv。

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

      在两个 shell 中都使用这个命令:

      $ env
      

      并尝试找出差异

      【讨论】:

        【解决方案4】:

        即使这个问题已经解决,我还是为再次遇到这个问题的人写这篇文章。 在所有尝试之后,我的 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/

        成功了!

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 有趣的是,我需要这样做,即使我在目录中有一个具有正确版本的.python-version
          • 如果.python-version 未被读取,您可能需要修复您的pyenv 配置:github.com/pyenv/pyenv#basic-github-checkout
          • 这是我遇到的大多数问题的解决方案。 (令人尴尬的是,每次我这样做时都需要用谷歌搜索这个答案!)谢谢。
          【解决方案6】:

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

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

          python = "^2.7"
          

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


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

          • poetry env list显示python诗歌可以使用的版本
          • poetry env use &lt;python&gt; 切换诗歌以使用该版本。

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

          ↪ poetry env list
          sipy-a9sqc5pb-py3.6 (Activated)
          sipy-a9sqc5pb-py3.7
          sipy-a9sqc5pb-py3.8
          

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

          管理虚拟环境

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

          【讨论】:

          • “Poetry 应该管理你所有的 python 依赖项,这样就不需要使用 pyenv。”——pyenv 不适用于 dependencies。它管理 Python 本身 的版本。诗歌本身就是这样做的吗?
          • 啊我的错。关键是pyproject.toml 文件说你的项目支持python2.7 或更好,而不是说'我想使用python3.8'。如果你想更新你的项目支持的 python 版本,那么直接更新 toml 文件
          • 我已经更新了我的答案,希望现在更有意义。
          • 很好的答案,谢谢。虽然我确实有一个后续问题:如何增加 Poetry 的虚拟环境选项数量?当我现在运行poetry env list 时,只有一个选项,那就是 Python 2.7。那么我想要的是也有 Python 3.8 的选项。
          • 我不知道该命令是否在去年发生了变化,但我认为当前的命令是 poetry env use python3.8 。来源:web.archive.org/web/20210130151158/https://python-poetry.org/…
          猜你喜欢
          • 2022-11-16
          • 2015-07-06
          • 2021-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-19
          • 2020-05-05
          相关资源
          最近更新 更多