поэзия меняет версию 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
вы должны позаботиться об этих моментах:
Бегать
poetry lock
потом или удалитеpoetry.lock
файл, чтобы принудительно восстановить его. Причины этого в том, чтоpoetry install
беретpoetry.lock
в качестве ввода, если можно найти один, а неpyproject.toml
.Если вы измените версию python и используете внутрипроектный virtualenv, удалите
.venv
перед запускомpoetry install
. поэзия не меняет версию venv для python после ее создания, потому что она использует саму версию python для создания файла virtualenv.
У меня такая же проблема. Решаю, исправив первую строчку в файле
/home/nordman/.poetry/bin/poetry
(nordman
это мое местное имя).
Просто измени
#!/usr/bin/env python
к
#!/usr/bin/env python3
Я перепробовал все решения, которые смог найти, но не смог заставить поэзию подобрать обновленную версию Python. Наконец-то нашел то, что сработало.
тлдр;
- Бегите, чтобы использовать местные venvs
- Выполнить, чтобы выйти из любого существующего venv
- Запустите, чтобы активировать новый локальный 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"