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

Согласно документам поэзии, правильный способ создания нового проекта - это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? Просто меняя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.

12 ответов

Решение

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

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

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

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

      which python3.7

Использовать:

      poetry env use 3.9

или же

      poetry env use $(which python3.9)

по какой-то причине не работает для python 3.9. Несмотря на явное указание требования к версии в pyproject.tomlфайл, печально, что нужно вручную применять это.

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

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

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

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

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

Я перепробовал все решения, которые смог найти, но не смог заставить поэзию подобрать обновленную версию Python. Наконец-то нашел то, что сработало.

тлдр;

  1. Бегите, чтобы использовать местные venvs
  2. Выполнить, чтобы выйти из любого существующего venv
  3. Запустите, чтобы активировать новый локальный 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

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

Вы можете просто использовать 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

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

      python --version                                                                                                                  
Python 2.7.16

Итак, приступим к установке. Я использовал установочный скрипт с GitHub . Использование этого сценария - рекомендуемый метод установки (хотя я бы сказал, что это НЕ лучшая идея передавать сценарии из Интернета в интерпретатор). Сценарий установки довольно умен: он пытается определить, какие из них доступны в системе:

      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, и это то, что возвращается при вызове, запись в ~/.poetry/bin будет выглядеть так:

      #!/usr/bin/env python

И вот! Значение по умолчанию попадет в файл, и вам нужно будет потанцевать, чтобы: а) убедиться, что это зависимость для вашего проекта; и б) что виртуальная среда будет использоваться как python устный переводчик.

Как упоминалось в @mfalade, вы можете установить среду с помощью poetry env:

      poetry env use /path/to/python3

А также изменение pyproject.toml с:

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

С этого момента вам хорошо идти, poetry будет использовать для создания виртуальной среды для вашего проекта, зависимость указана в файле и ... трава снова зеленая.

Но можем ли мы использовать по умолчанию? На GitHub есть проницательная ветка и еще одна . И если вы посмотрите на фрагмент кода из приведенного выше сценария установки, вы можете спросить, почему бы не проверить python3сначала, а затем для python, особенно с учетом того, что это точный порядок установки Windows. Ну ты не одинок, мне тоже интересно;)

Я бы не предлагал редактировать ~/.poetry/bin/poetry файл напрямую, поскольку этот файл создается сценарием установки (так что же произойдет, если вы снова запустите сценарий установки? И снова?).

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

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

Как я это делаю, и это очень эффективно: используйте 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

Используйте виртуальную среду, которую мы только что создали. Прикрепите к нему этот проект. Ниже создается файл версии .python с указанием arshbot_3.7_virtualenv.

      pyenv local arshbot_3.7_virtualenv

Используйте поэзию init, чтобы создать pyproject.toml внутри каталога, используя arshbot_3.7_virtualenv. Вы также можете использовать новую поэзию вместо поэзии init для создания структуры проекта вместе с pyproject.toml вместо того, чтобы делать свой проект первым на предыдущем шаге. С pyproject.toml и .python-version внутри этого каталога, поэзия автоматически выберет версию 3.7, предоставленную arshbot_3.7_virtualenv. Poetry также будет использовать эту виртуальную среду для установки пакетов в ~/.pyenv/versions/3.7/envs/arshbot_3.7_virtualenv/lib/python3.7/site-packages.

      poetry init

Вот и все. Poetry будет автоматически выбирать версию 3.7 каждый раз, когда вы запускаете ее из этого каталога, прикрепленного к этой виртуальной среде, при этом она активирована. Для другой версии Python просто повторите описанные выше шаги, замените 3.7 новой версией. Виртуальная среда появится дважды: в каталоге envs как виртуальная среда, а также в каталоге версий как версия с репликацией содержимого, когда поэзия устанавливает пакеты.

БОНУС: мы пытаемся сделать его еще более понятным, используя другой подход, ту же концепцию, те же результаты. Поскольку по умолчанию, если вы не изменили PYENV_ROOT, pyenv устанавливает каждую версию Python в ~/.pyenv/versions: если вы хотите, чтобы системная версия (поставляемая с вашим дистрибутивом) была частью версий, которые вы можете выбрать, используйте venv для имитируйте установку pyenv версии python, теперь назовите ее 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 для проекта, используя файлы из виртуальной среды.

Я использую Ubuntu 22.04 и у меня установлен только Python 3.10. Я достаточно раз уничтожил свой системный Python, поэтому отказываюсь танцевать со старыми версиями или запускать какие-либо установки из pip. Я хотел более старую версию python, которая была установлена ​​не поверх моей текущей установки python. Что я сделал, так это следовал этому руководству .

      sudo apt install libgdbm-dev build-essential libnss3-dev libreadline-dev libffi-dev libsqlite3-dev libbz2-dev libncurses5-dev libssl-dev zlib1g-dev
cd /tmp
wget https://www.python.org/ftp/python/3.9.14/Python-3.9.14.tgz
tar -xf Python-3.9.14.tgz
cd Python-3.9.14 
./configure --enable-optimizations

## if you want to run in parallel set -j to how many cpus you have
## I subtracted 2 so my machine wouldn't have a stroke
# lscpu | egrep 'CPU\(s\)'
# make -j <cpus you are comfortable with>
make

## Super important to run altinstall to not overwrite
sudo make altinstall

## I updated the pyproject.toml to ^3.9
poetry env use /usr/local/bin/python3.9

Проверяю это сейчас, если я ничего не опубликую после этого, это либо сработало, либо я больше не живу.

Просто отредактируйтеpyproject.tomlфайл и измените версию python на 3.7, как показано ниже:

      python = "^3.7"
Другие вопросы по тегам