Предисловие : я хорошо знаком с крайним сроком 1 января 2020 года и сейчас использую Python 2 во всех своих проектах, но этот сюрприз от setuptools, тем не менее, довольно неудобен. Если вы решили не исправлять это, я не буду никого осуждать, но, пожалуйста, не читайте мне лекций о том, что Python 2 устарел :-)
Все мои сценарии автоматизированного создания виртуальной среды на Python 2 сегодня начали ломаться.
Вот пример:
$ py -2.7-32 -m virtualenv foo
…
UnsupportedPythonVersion: Package 'setuptools' requires a different Python: 2.7.8 not in '>=3.5'
…
OSError: Command …\Scripts\python.exe - setuptools pip wheel failed with error code 1
Похоже, это вызвано вчера выпуском setuptools
v45.0.0:
Версия 45.0.0: 11 января 2020 г.
1458: Прекращена поддержка Python 2. Для инструментов установки теперь требуется Python 3.5 или новее. Установите setuptools с помощью pip> = 9 или закрепите на Setuptools <45, чтобы поддерживать поддержку 2.7.
1959: Исправление для Python 4: замените unsafe six.PY3 на six.PY2https://setuptools.readthedocs.io/en/latest/history.html#v45 -0-0
Похоже, что по умолчанию virtualenv
пытается установить последние средства установки, а pip install setuptools
выбирает setuptools>=45.0.0
даже если эти версии не поддерживают Python 2.
В качестве обходного пути я сейчас использую следующие команды:
$ py -2.7-32 -m virtualenv --no-setuptools foo
$ foo\Scripts\python -m pip install "setuptools<45"
Я не экспортирую упаковку Python, но я ожидаю, что setuptools>=45
объявит, что он не поддерживает Python 2 в своих метаданных распространения, и что pip install setuptools
автоматически обнаружит это и избежит этого, но это похоже, что это не так.
Если это невозможно, возможно, в версиях virtualenv
для Python 2 следует избегать setuptools>=45
?
Я подтверждаю, что это серьезная проблема. В OpenStack из-за этого ломаются большинство ворот. См .: http://lists.openstack.org/pipermail/openstack-discuss/2020-January/011956.html
Спасибо за отчет, / я опоздал на полчаса - я думал, что virtualenv будет использовать современный преобразователь pip, но, похоже, это не так.
Уже отслеживается в setuptools для другого нисходящего потока https://github.com/pypa/setuptools/issues/1963
Не уверен, почему выбирается setuptools 45+, bootstrap virtualenvs должен оставить его 44 для setuptools. 🤔
Вот трассировка: http://paste.openstack.org/show/788301/
legacy_resolve похоже на то, что отменяет новые правила.
Нет, неправильный путь для изучения, raw pip также игнорирует ограничение версии py (несмотря на то, что он рекламируется как работающий): http://paste.openstack.org/show/788302/
Я посмотрю и завтра выпущу исправление. Если у кого-то есть время сделать пиар до этого, это поможет.
@yoctozepto не может повторить вашу неудачу; вы можете предоставить нам полный журнал создания с тройной детализацией?
@gaborbernat Если это та же проблема, что и pypa / pip # 7586, то это может быть ошибка в одном из зеркал PyPA, которое использует .
По-видимому, один из них неправильно передает информацию python_requires
.
Если так, то это ошибка того зеркала; ничего общего с собой 🤷♂
Следующее помогло мне выйти из этой проблемы.
pip install --upgrade 'setuptools <45.0.0'
Я работаю над проектом, который все еще использует python 2.7 :(, и у меня была та же проблема.
Но, используя команду выше (от ikrambabai), это снова сработало !! : D
Спасибо!
Однако это все еще критично при создании новой виртуальной среды для python 2.7, поскольку virtualenv
загрузит setuptools-45.0.0
, и никакое обновление (переход на более раннюю версию через pip с помощью pip install --upgrade 'setuptools<45.0.0'
) фактически не удалит его. . Единственное решение - загрузить колесо вручную.
Однако это все еще критично при создании новой виртуальной среды для python 2.7, поскольку
virtualenv
загрузитsetuptools-45.0.0
, и никакое обновление (переход на более раннюю версию через pip с помощьюpip install --upgrade 'setuptools<45.0.0'
) фактически не удалит его. . Единственное решение - загрузить колесо вручную.
Это должно происходить только в том случае, если вы находитесь за сервером индексирования, который не поддерживает python-requires ... поэтому я бы рекомендовал исправить сервер индексирования.
@gaborbernat я не в курсе. Есть ли способ проверить это?
Я вижу, что pythonhosted.org используется при загрузке пакетов при создании virtualenv:
Installing setuptools, pkg_resources, pip, wheel...
Running command /opt/llenv22/bin/python2.7 - setuptools pkg_resources pip wheel
Collecting setuptools
Using cached https://files.pythonhosted.org/packages/af/e7/02db816dc88c598281bacebbb7ccf2c9f1a6164942e88f1a0fded8643659/setuptools-45.0.0-py2.py3-none-any.whl
Collecting pkg_resources
Collecting pip
Using cached https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c13f3/pip-20.0.2-py2.py3-none-any.whl
Collecting wheel
Using cached https://files.pythonhosted.org/packages/00/83/b4a77d044e78ad1a45610eb88f745be2fd2c6d658f9798a15e384b7d57c9/wheel-0.33.6-py2.py3-none-any.whl
Передайте флаги -v для pip install setuptools -vvv
?
Это работает, и установлена правильная версия:
Collecting setuptools
Created temporary directory: /tmp/pip-unpack-zJMfUH
Starting new HTTPS connection (1): files.pythonhosted.org:443
https://files.pythonhosted.org:443 "GET /packages/f9/d3/955738b20d3832dfa3cd3d9b07e29a8162edb480bf988332f5e6e48ca444/setuptools-44.0.0-py2.py3-none-any.whl HTTP/1.1" 200 583230
Downloading setuptools-44.0.0-py2.py3-none-any.whl (583 kB)
|████████████████████████████████| 583 kB 3.3 MB/s
Added setuptools from https://files.pythonhosted.org/packages/f9/d3/955738b20d3832dfa3cd3d9b07e29a8162edb480bf988332f5e6e48ca444/setuptools-44.0.0-py2.py3-none-any.whl#sha256=180081a244d0888b0065e18206950d603f6550721bd6f8c0a10221ed467dd78e to build tracker '/tmp/pip-req-tracker-OTDORt'
Removed setuptools from https://files.pythonhosted.org/packages/f9/d3/955738b20d3832dfa3cd3d9b07e29a8162edb480bf988332f5e6e48ca444/setuptools-44.0.0-py2.py3-none-any.whl#sha256=180081a244d0888b0065e18206950d603f6550721bd6f8c0a10221ed467dd78e from build tracker '/tmp/pip-req-tracker-OTDORt'
Installing collected packages: setuptools
Created temporary directory: /tmp/pip-unpacked-wheel-vDEYe
Проблема возникает только при создании виртуальной среды.
@ostefano Для меня было то же самое. Я работал над этим, явно установив setuptools
:
$ py -2.7-32 -m virtualenv --no-setuptools foo
$ foo\Scripts\python -m pip install "setuptools<45"
Мы столкнулись с той же проблемой: https://github.com/mozilla-services/syncserver/issues/239
Сначала я подумал, что pythonhosted.org не соблюдает флаг Requires-Python
но с тем же зеркалом он работает на Debian Stretch с Python 2.7.13, в то время как он не работает на Ubuntu Xenial с Python 2.7.12, в остальном довольно чистые настройки системы, даже протестирован в среде Docker. Версия Python не может быть причиной, поскольку такая же проблема уже сообщалась с Ubuntu Bionic и Python 2.7.17.
Итак, я недоумеваю, где / на каком уровне нужно искать ошибку, Python, virtualenv, pip, pythonhosted.org или есть что-то посередине?
Обходной путь ясен, но было бы здорово исследовать и исправить причину, по которой setuptools 45 был извлечен в первую очередь.
Самый полезный комментарий
Следующее помогло мне выйти из этой проблемы.
pip install --upgrade 'setuptools <45.0.0'