поэзия меняет версию Python на 3.x

Согласно поэтическим документам, правильный способ настройки нового проекта - использовать poetry new poetry-demo, однако при этом создается проект на основе устаревшего python2.7 путем создания следующего файла toml:

[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
authors = ["Harsha Goli <[email protected]>"]

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

person arshbot    schedule 07.03.2020    source источник
comment
При создании нового проекта похоже, что Poetry вставляет версию Python, на которой работает сама Poetry. Итак, вы должны проверить, почему poetry new poetry-demo запускался на Python 2 вместо 3.   -  person Thomas    schedule 01.02.2021


Ответы (7)


Каждый раз, когда вы вручную меняете зависимости в своем pyproject.toml, вы должны позаботиться об этих моментах:

  1. После этого запустите poetry lock или удалите poetry.lock файл, чтобы принудительно восстановить его. Причина этого в том, что poetry install принимает poetry.lock в качестве входных данных, если может его найти, а не pyproject.toml.

  2. Если вы измените версию Python и используете внутрипроектный virtualenv, удалите .venv перед запуском poetry install. поэзия не меняет версию venv для python после ее создания, поскольку она использует саму версию python для создания файла virtualenv.

person finswimmer    schedule 09.03.2020

У меня такая же проблема. Я решаю эту проблему, исправляя первую строку в файле /home/nordman/.poetry/bin/poetry (nordman - мое локальное имя).

Просто измените #!/usr/bin/env python на #!/usr/bin/env python3

person NordMan    schedule 10.10.2020
comment
Что будет, когда вы решите обновить поэзию? Сохранится ли это изменение? - person at0S; 18.02.2021
comment
Я еще не обновил стихи - person NordMan; 19.02.2021

Поэзия упрощает работу с различными версиями Python или виртуальными средами. Рекомендуемый способ указать версию Python в соответствии с документами по поэзии является

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

Вы можете получить путь к своей версии Python, запустив

which python3.7
person mfalade    schedule 06.01.2021

Вы можете изменить pyproject.toml и выполнить эту команду, поэзия env use 3.x, которая работает для меня.

person Claudio Vaz    schedule 21.07.2020

Интересно, что поэзия молча терпит неудачу из-за отсутствия пакета, на который полагается сам инструмент и продолжает устанавливать сломанный 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

person arshbot    schedule 07.03.2020
comment
Это сработало! за исключением того, что я переустановил pytest, он не был установлен первым! - person Abbas; 06.05.2020

Я испытал точно такое же поведение на своем MacBook! Итак, чтобы сделать это практичным, сначала давайте посмотрим, какой Python используется по умолчанию для MacBook. Я использую macOS Big Sur 11.2.1 (20D74). В терминале:

python --version                                                                                                                  
Python 2.7.16

Итак, давайте установим poetry. Я использовал poetry скрипт установки из GitHub . Использование этого скрипта является рекомендуемым методом для установки poetry (хотя я бы сказал, что это НЕ Лучшая идея передать скрипты из Интернета в 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, и вам нужно будет дополнительно потанцевать, чтобы: а) убедиться, что python3 является зависимостью для вашего проекта; и б) что виртуальная среда будет использовать 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 файл напрямую, так как этот файл создается сценарием установки (так что же произойдет, если вы снова запустите сценарий установки? И снова?).

На самом деле, это незначительное раздражение, и зная инструмент, его легко обойти. Я ожидал, что это будет упомянуто в руководстве по установке ...

В любом случае, надеюсь, это поможет!

person at0S    schedule 18.02.2021

Вы можете просто использовать для этого pyenv. Создайте .python-version файл внутри своего проекта, и poetry будет соответствовать точной версии Python.

# check current python version (set up globally)
❯ pyenv version
3.9.0 (set by /Users/[email protected]/.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/[email protected]/Documents/myproject/.python-version)

❯ poetry lock
(...)

❯ poetry run python --version
Python 3.9.0
person Hunter_71    schedule 24.05.2021
comment
poetry инструмент сам управляет версиями Python. Вы тоже можете сделать это сами! - person ssoto; 29.06.2021