33

根据poetry的文档,设置新项目的正确方法是 with poetry new poetry-demo,但是这会通过创建以下 toml 文件来创建一个基于现已弃用的 python2.7 的项目:

[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?运行时只需更改python = "^2.7"python = "^3.7"会导致以下错误poetry install

[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.
4

10 回答 10

27

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

  1. 之后运行poetry lock或删除poetry.lock文件以强制重新创建它。poetry install这样做的原因是,poetry.lock如果可以找到一个而不是pyproject.toml.

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

于 2020-03-09T14:06:59.527 回答
25

Poetry 让使用不同的 Python 版本或虚拟环境变得非常容易。根据诗歌文档指定 Python 版本的推荐方法是

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

您可以通过运行获取 Python 版本的路径

which python3.7
于 2021-01-06T02:22:52.040 回答
9

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

只需更改#!/usr/bin/env python#!/usr/bin/env python3

于 2020-10-10T11:50:37.450 回答
6

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

于 2020-07-21T16:25:38.077 回答
5

有趣的是,由于缺少该工具本身所依赖的包并继续安装损坏的 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

于 2020-03-07T17:08:30.447 回答
4

采用:

poetry env use 3.9

或者

poetry env use $(which python3.9)

由于某种原因,python 3.9 不起作用。尽管在pyproject.toml文件中明确说明了版本要求,但遗憾的是需要手动执行此操作。

于 2021-12-14T15:06:46.400 回答
3

我在 MacBook 上经历了完全相同的行为!因此,为了使这个实用,首先让我们看看 MacBook 的默认 Python 是什么。我正在运行 macOS Big Sur 11.2.1 (20D74)。在终端:

python --version                                                                                                                  
Python 2.7.16

有了这个,让我们安装poetry. 我使用poetry 了来自 GitHub 的安装脚本。使用此脚本是推荐的安装方法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,因此 in 中的条目~/.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默认使用吗?GitHub 上有一个有见地的线程,另一个. 如果您回顾上面安装脚本中的代码片段,您可能想知道为什么不先检查python3然后检查 python,特别是考虑到这是 Windows 安装的确切顺序。好吧,你并不孤单,我也想知道;)

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

确实,这是一个小烦恼,并且知道该工具很容易解决它。我希望在安装指南中提到这一点......

无论如何,希望它有所帮助!

于 2021-02-18T05:15:43.390 回答
2

你可以简单地使用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
于 2021-05-24T12:01:30.447 回答
1

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

使用 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

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

pyenv local arshbot_3.7_virtualenv

使用诗歌 init 使用 arshbot_3.7_virtualenv 在目录中创建 pyproject.toml。您还可以使用新的诗歌而不是诗歌初始化来创建项目结构以及 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 并激活它时,Poetry 都会自动选择 3.7。对于不同的python版本,只需重复上述步骤,将3.7替换为新版本即可。虚拟环境将出现两次:在 envs 目录中作为虚拟环境,并且在版本目录中作为版本,在诗歌安装包时复制内容。

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

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,通常很有用。

于 2021-12-22T12:03:28.017 回答
1

我尝试了所有我能找到的解决方案,但无法获得诗歌来获取 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上面的输出)。

所以根据文档,我跑去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

于 2021-12-31T19:34:26.530 回答