将 python 版本更改为 3.x

Change python version to 3.x

根据 poetry's docs,设置新项目的正确方法是使用 poetry new poetry-demo,但是这会创建一个基于现已弃用的 python2.7 的项目,方法是创建以下内容toml 文件:

[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
authors = ["Harsha Goli <harshagoli@gmail.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"

如何将其更新到 3.7?当 poetry install 为 运行 时,简单地将 python = "^2.7" 更改为 python = "^3.7" 会导致以下错误:

[SolverProblemError]
The current project's Python requirement (2.7.17) is not compatible with some of the required packages Python requirement:
  - zipp requires Python >=3.6

Because no versions of pytest match >=4.6,<4.6.9 || >4.6.9,<5.0
 and pytest (4.6.9) depends on importlib-metadata (>=0.12), pytest (>=4.6,<5.0) requires importlib-metadata (>=0.12).
And because no versions of importlib-metadata match >=0.12,<1.5.0 || >1.5.0
 and importlib-metadata (1.5.0) depends on zipp (>=0.5), pytest (>=4.6,<5.0) requires zipp (>=0.5).
Because zipp (3.1.0) requires Python >=3.6
 and no versions of zipp match >=0.5,<3.1.0 || >3.1.0, zipp is forbidden.
Thus, pytest is forbidden.
So, because poetry-demo depends on pytest (^4.6), version solving failed.

有趣的是,poetry 由于缺少该工具本身所依赖的软件包并继续安装损坏的 venv 而悄无声息地失败了。修复方法如下。

sudo apt install python3-venv
poetry env remove python3
poetry install

我不得不删除 pytest,然后使用 poetry add pytest 重新安装。

编辑:在将项目从 python3.7 升级到 python3.8 时,我 运行 再次陷入这个问题 - 为此而不是安装 python3-venv,你想要安装 python3.8-venv 而不是

每当您在 pyproject.toml 中手动更改依赖项时,您必须注意以下几点:

  1. 运行 poetry lock --no-update 之后。这样做的原因是,poetry installpoetry.lock 作为输入,如果可以找到一个而不是 pyproject.toml

  2. 如果更改python版本并使用项目内virtualenv,请删除运行 poetry install之前的.venv。 poetry 在创建 venv 后不会更改 python 版本,因为它使用 python 版本本身来创建 virtualenv。

您可以更改 pyproject.toml 并执行对我有用的命令“poetry env use 3.x”。

我遇到了同样的问题。我通过修复文件 /home/nordman/.poetry/bin/poetry 中的第一行来解决它(nordman 是我的本地名称)。

只要把#!/usr/bin/env python改成#!/usr/bin/env python3

Poetry 让使用不同的 Python 版本或虚拟环境变得超级容易。根据 Poetry docs 指定 Python 版本的推荐方法是

poetry env use /path/to/preferred/python/version

您可以通过 运行

获取 Python 版本的路径
which python3.7

我在我的 MacBook 上遇到过完全相同的行为!因此,为了使这个更实用,首先,让我们看看 MacBook 的默认值 Python 是多少。我正在 运行ning macOS Big Sur 11.2.1 (20D74)。在终端中:

python --version                                                                                                                  
Python 2.7.16

有了这些,让我们安装 poetry。我已经使用 poetry installation script from the GitHub. Using this script is a recommended method 安装 poetry (尽管我认为这不是将脚本从 Internet 传输到 python 解释器的最佳主意) 安装脚本非常聪明:它会尝试检测系统上可用的 python

def _which_python(self):
    """Decides which python executable we'll embed in the launcher script."""
    allowed_executables = ["python", "python3"]
    if WINDOWS:
        allowed_executables += ["py.exe -3", "py.exe -2"]
...

因此,默认 Python 是 2.7.16,这是调用 python 返回的值,~/.poetry/bin 中的条目将如下所示:

#!/usr/bin/env python

给你!默认的 python 将出现在 pyproject.toml 文件中,您需要做一些额外的准备工作来 a) 确保 python3 是您项目的依赖项; b) 虚拟环境将使用 python3 作为 python 解释器。

如@mfalade 所述,您可以使用 poetry env:

设置环境
poetry env use /path/to/python3

并且还将 pyproject.toml 修改为:

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

从这里开始,您可以开始了,poetry 将使用 python3 为您的项目创建虚拟环境,依赖项在文件中指定并且...草又绿了。

但是我们可以默认使用python3吗?有一个insightful thread on GitHub and another one。如果您回顾上面安装脚本中的代码片段,您可能想知道为什么不先检查 python3 然后再检查 python,尤其是考虑到这是 Windows安装。好吧,你不是一个人,我也想知道;)

我不建议直接编辑 ~/.poetry/bin/poetry 文件,因为这个文件是由安装脚本生成的(所以如果你再次 运行 安装脚本会发生什么?又一次?)。

真的,这是一个小麻烦,知道这个工具很容易解决它。我希望在安装指南中提到这一点...

总之,希望对您有所帮助!

您只需使用 pyenv 即可。在项目中创建 .python-version 文件,poetry 将匹配确切的 python 版本。

# check current python version (set up globally)
❯ pyenv version
3.9.0 (set by /Users/tomasz.zieba@showpad.com/.python-version)

# create .python-version file for project
❯ pyenv local 3.9.0

# check python version again (now it's set up locally)
❯ pyenv version
3.9.0 (set by /Users/tomasz.zieba@showpad.com/Documents/myproject/.python-version)

❯ poetry lock
(...)

❯ poetry run python --version
Python 3.9.0

使用:

poetry env use 3.9

poetry env use $(which python3.9)

由于某些原因不适用于 python 3.9。尽管在 pyproject.toml 文件中明确规定了版本要求,但令人遗憾的是需要手动执行此要求。

我这样做的方式非常有效: 使用 pyenv 管理 pyenv 版本,它的插件 pyenv-virtualenv 将版本管理为虚拟环境,然后 poetry 在管理依赖项时自动从中选择版本:

使用 pyenv 安装任何你想使用的 python 版本:

pyenv install -v 3.7

根据安装的3.7版本创建虚拟环境。 您将需要插件 pyenv-virtualenv。

pyenv virtualenv 3.7 arshbot_3.7_virtualenv

假设一个名为 arshbot_proj 的项目。在 $HOME 目录中工作:

mkdir ~/arshbot_proj
cd ~/arshbot_proj

使用我们刚刚创建的虚拟环境。将此项目附加到它。 下面创建 .python-version 文件,指示 arshbot_3.7_virtualenv.

pyenv local arshbot_3.7_virtualenv

使用 poetry init 在目录中创建 pyproject.toml 使用 arshbot_3.7_virtualenv。 您也可以使用 poetry new 而不是 poetry init 来创建项目 与 pyproject.toml 一起构建,而不是让你的项目首先进入 以上步骤。 pyproject.toml 和 .python-version 都在这个目录中,诗歌 将自动选择 arshbot_3.7_virtualenv 提供的 3.7。 Poetry 也会使用这个虚拟环境来安装包在 ~/.pyenv/versions/3.7/envs/arshbot_3.7_virtualenv/lib/python3.7/site-packages

poetry init

就是这样。每次您 运行 Poetry 都会从附加到该虚拟环境的目录中自动选择 3.7,并激活它。对于不同的 python 版本,只需重复上述步骤,将 3.7 替换为新版本即可。 虚拟环境会出现两次:在envs目录下作为虚拟环境,在versions目录下作为版本,在poetry安装包时复制内容

奖金: 我们尝试使用不同的方法、相同的概念、相同的结果使其更加清晰。 因为默认情况下,如果你没有更改 PYENV_ROOT,pyenv 会在 ~/.pyenv/versions 中安装每个 python 版本: 如果您希望系统版本(随您的发行版一起提供)成为您可以 select 版本的一部分,请使用 venv 来模仿 python 版本的 pyenv 安装,现在将其命名为 system_ver代替 3.7。由于已经在系统中,我们不需要pyenv来下载它,我们将它复制到我们的versions目录下,这样就可以用来创建虚拟环境了

cd ~/.pyenv/versions
python3 -m venv --copies system system_ver
pyenv virtualenv system_ver system_ver_virtualenv

要在您的项目中使用它来代替之前的 3.7 版本:

cd ~/arshbot_proj
pyenv local system_ver_virtualenv

Poetry 现在将使用您的发行版最初附带的任何版本。 --copies 将确保 venv 复制文件而不是使用链接,因此您可以省略它。如果您稍后需要使用虚拟环境中的文件为项目制作多阶段 dockerfile,通常很有用。

我尝试了我能找到的所有解决方案,但无法让诗歌获得 Python 的升级版本。终于找到了有用的东西。

tldr;

  1. 运行 poetry config virtualenvs.in-project true 使用本地 venvs
  2. 运行 deactivate 退出任何现有的 venv
  3. 运行 poetry shell 激活一个新的本地 venv

这就是我所看到的:

(my-project) ~/I/my-project ❯❯❯ poetry env info

Virtualenv
Python:         3.9.6
Implementation: CPython
Path:           /Users/my-user/.local/share/virtualenvs/my-project-some-hash
Valid:          True

System
Platform: darwin
OS:       posix
Python:   /usr/local/opt/python@3.9/Frameworks/Python.framework/Versions/3.9

我尝试了 运行 poetry env remove python 并得到一个错误:


(my-project) ~/I/my-project ❯❯❯ poetry env remove python

  ValueError

  Environment "my-project-some-hash-py3.9" does not exist.

同时,我在某处看到建议通过设置此属性来使用本地虚拟环境,所以我做到了:

poetry config virtualenvs.in-project true

这并没有解决我的问题,但后来我意识到更改此设置不会自动生效,因为我已经在另一个非本地虚拟环境中(参见上面的 poetry env info 输出)。

所以在docs的基础上,我运行deactivate停用了当前的虚拟环境

现在,我看到了这个:

~/I/my-project ❯❯❯ poetry env info

Virtualenv
Python:         3.10.1
Implementation: CPython
Path:           NA

System
Platform: darwin
OS:       posix
Python:   /Users/my-user/.pyenv/versions/3.10.1

现在我 运行 poetry shell 创建一个新的虚拟环境,它选择了新的本地 venvs 设置:

~/I/my-project ❯❯❯ poetry shell
Creating virtualenv my-project in /Users/my-user/projects/my-project/.venv
Spawning shell within /Users/my-user/projects/my-project/.venv

终于,我看到了我期待的 Python 升级版本!

(.venv) ~/I/my-project ❯❯❯ poetry run python -V
Python 3.10.1

更新: 完成上述所有操作后,我注意到 poetry env use 工作正常!

(.venv) ~/I/my-project ❯❯❯ python -V
Python 3.10.1
(.venv) ~/I/my-project ❯❯❯ poetry env use 3.9.6
Recreating virtualenv my-project in /Users/my-user/projects/my-project/.venv
Using virtualenv: /Users/my-user/projects/my-project/.venv
(.venv) ~/I/my-project ❯❯❯ python -V
Python 3.9.6