Virtualenv: Setuptools v45.0.0 нарушает работу virtualenv на Python 2

Созданный на 12 янв. 2020  ·  18Комментарии  ·  Источник: pypa/virtualenv

Предисловие : я хорошо знаком с крайним сроком 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.PY2

https://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 ?

Самый полезный комментарий

Следующее помогло мне выйти из этой проблемы.

pip install --upgrade 'setuptools <45.0.0'

Все 18 Комментарий

Я подтверждаю, что это серьезная проблема. В 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 был извлечен в первую очередь.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги