pypi UserWarning: Неизвестный вариант распространения: 'install_requires'

113

Кто-нибудь сталкивался с этим предупреждением при выполнении python setup.py installпакета PyPI?

install_requiresопределяет, что требуется для пакета. Эта опция есть во многих пакетах PyPI. Как это может быть «неизвестный вариант распространения»?

Тайлер Лонг
источник
@tripleee может быть, но этот вопрос задавали раньше, чем этот.
Тайлер Лонг
Возраст вопросов - это второстепенная проблема, но у меня в любом случае нет твердого мнения. Если вы хотите, чтобы дублированная номинация была другой, возможно, создайте вопрос о переполнении мета-стека для наглядности. Лично мне принятый ответ на другой вопрос помог мне больше, потому что он более прямой и целенаправленный. Кажется, вы никогда не принимали ни одного из этих ответов, так что это фактор, который вы действительно можете изменить.
Tripleee
1
@tripleee, если вы внимательно прочтете эту ветку, то поймете, что идеального ответа нет. Так что я не знаю, какой ответ принять. Я не хочу вводить людей в заблуждение, выбирая ответ, который не может убедить даже меня.
Тайлер Лонг

Ответы:

89

python setup.pyиспользует distutils, который не поддерживает install_requires. setuptools также распространяет (его преемник) и pip (который использует любой из них) делает. Но на самом деле их нужно использовать. Т.е. вызываем setuptools через easy_installкоманду или pip install.

Другой способ - импортировать установку из setuptools в ваш setup.py, но это не стандартно и заставляет всех, кто хочет использовать ваш пакет, иметь установленные setuptools.

Себастьян Бласк
источник
3
Скажем, я хочу использовать pip, тогда как мне запустить setup.pyфайл, если я хочу только создать расширение на месте?
Фред Фу
11
Предупреждение не мешает вам упаковать код, поэтому вы можете запустить python setup.py sdistи установить его с помощью pip install resulting_package.tar.gz. Вы также можете использовать pip install -eдля установки непосредственно из исходного кода, но я всегда предпочитал установку из пакета или напрямую из репозитория ..
Себастьян Бласк,
Это немного запуталось. Вы всегда можете сначала попробовать импортировать настройки из setuptools, иначе воспользуйтесь distutils и получите предупреждение. Однако, если он в pypy, вы можете получить «Слишком много открытых файлов» из-за того, что инструменты установки не закрывают дескрипторы должным образом (даже в Debian, со значением ulimit -n по умолчанию 1024): bugs.pypy.org/issue878
fiorix
1
Смотрите мой ответ - насколько я могу судить, это просто ошибка в setuptools. Пользователь ничего плохого не делает, setuptools.
ncoghlan 02
Это косвенно отвечает на мой вопрос: я получил ошибку в результате запуска pip install pendulum==1.4.4. Бег pip install setuptools --upgradeустранил ошибку.
аккаунт
32

Это был первый результат моего поиска в Google, но ответа не было. Я обнаружил, что обновление setuptools решило проблему для меня (и пип для хорошей меры)

pip install --upgrade pip
pip install --upgrade setuptools

Надеюсь, это поможет следующему человеку найти эту ссылку!

Мэтт
источник
Это решило это и для меня. (Python 3.4, пытается pip3 install neovim-remote.)
Майкл Айлз
Это сработало для меня. Пытался установить мако на Python 2.7.16. Получил аналогичный вариант Неизвестного распространения. Пип был в порядке, но инструменты установки перешли на 41.0.1 с 40.6.2. Затем Мако установил A-OK.
Макс Яффе
18

ВНИМАНИЕ ! ВНИМАНИЕ ! Впереди несовершенный ответ. Чтобы получить «последнюю заметку» о состоянии упаковки во вселенной Python, прочтите это довольно подробное эссе. .

Я только что столкнулся с этой проблемой при попытке собрать / установить ansible. Проблема, похоже, в том, что distutils действительно не поддерживает install_requires. Инструменты настройки должны monkey-patch distutils на лету, но этого не происходит, вероятно, потому, что последний выпуск setuptools - 0.6c11 от 2009 года, тогда как distutils является основным проектом Python.

Таким образом, даже после ручной установки setuptools-0.6c11-py2.7.egg запуск setup.py выбирает только distutils dist.py, а не тот из site-packages / setuptools /.

Также документация setuptools указывает на использование ez_setup а не distutils.

Однако в настоящее время setuptools сам предоставляется через distribute , и этот вариант setup () поддерживает install_requires.

PAStheLoD
источник
1
Проголосовано против, поскольку этот ответ содержит некоторую дезинформацию и неясность относительно того, что есть разные вещи. ez_setup.py, например, является установщиком начальной загрузки для setuptools и не является чем-то, что можно было бы использовать вместо distutils. Большинство пакетов PyPI не «просто неправильные».
Iguananaut 04
1
@Iguananaut, спасибо, что просмотрели ответ; Я его отредактировал.
PAStheLoD 04
О, круто, спасибо. Я повторно проголосую в этом случае :) Эссе Ника Коглана, на которое вы ссылаетесь, - это то, что я поделился со своими коллегами раньше, чтобы попытаться заставить их осмыслить этот материал.
Iguananaut 05
Большой очерк о состоянии дел в марте 2013 года один вопрос ... Автор утверждает: « setuptoolsи distributeпроекты находятся в процессе слияния вместе, но слияние не завершено пока (я буду обновлять эту статью , как только что меняется) ". Кто-нибудь знает, как обстоят дела по состоянию на 2019 год? С приближением даты окончания срока службы Python 2.7 многие пакеты Python будут обновляться и переупаковываться.
TrinitronX
16

Я нахожусь на Mac с python 2.7.11. Я занимался созданием чрезвычайно простых и понятных проектов, где мое единственное требование - я мог запускать python setup.py installи setup.pyиспользовать команду установки, в идеале из distutils. Буквально нет никакого другого импорта или кода, кроме kwargs, setup()кроме того, что я здесь отмечу.

Я получаю сообщение об ошибке, если импорт моего setup.pyфайла:

from distutils.core import setup

Когда я использую это, я получаю такие предупреждения, как

/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: UserWarning: неизвестный вариант распространения: 'entry_points' warnings.warn ( сообщение)

Если я изменю импорт (и ничего больше ) на следующее:

from distutils.core import setup
import setuptools  # noqa

Предупреждения исчезнут.

Обратите внимание, что я не использую setuptools, просто импортируя его, он меняет поведение, так что он больше не выдает предупреждения. Для меня это причина поистине сбивающей с толку разницы, когда некоторые проекты, которые я использую, выдают эти предупреждения, а некоторые нет.

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


Это согласуется с другим комментарием (сообщества), в котором говорится, что distutils должен устанавливать monkeypatch setuptools, и что у них возникла проблема при установке Ansible. Похоже, что Ansible пытался разрешить установку без установки в прошлом, а затем вернулся к этому.

https://github.com/ansible/ansible/blob/devel/setup.py

Многое еще витает в воздухе ... но если вы ищете простой ответ для простого проекта, вам, вероятно, следует просто импортировать setuptools.

AlanSE
источник
1
Добавление import setuptoolsтакже чудесным образом решило проблему для меня на ubuntu 16.04 с python 3.5.
kuropan
8

Это предупреждение от distutils и признак того, что у вас не установлены инструменты установки. При установке с http://pypi.python.org/pypi/setuptools предупреждение будет удалено.

Фредрик Хард
источник
32
setuptools установлен. все еще есть предупреждение.
Тайлер Лонг
Вы совершенно правы, я получаю эту ошибку в Python 2.6.6, даже если установлены setuptools или distribute. Если я попробую с 2.7.2, он исчезнет.
Фредрик Хорд
4
У меня эта проблема в python 2.7.3
Calvin Cheng,
2
Это сделало это для меня: wget bootstrap.pypa.io/ez_setup.py -O - ​​| sudo python
radtek
Спасибо, @radtek, у меня это тоже сработало. Возможно, вы могли бы превратить свой комментарий в ответ?
Эстейс
4
sudo apt-get install python-dev  # for python2.x installs
sudo apt-get install python3-dev  # for python3.x installs

Он установит все недостающие заголовки. Это решило мою проблему

Прияншу Чаухан
источник
4

В заключение :

distutilsне поддерживает install_requiresили entry_points, setuptoolsделает.

изменение from distutils.core import setupв setup.py , чтобы from setuptools import setupили реорганизовать setup.py использовать только distutilsособенности.

Я пришел сюда, потому что не понял, что entry_pointsэто всего лишь setuptoolsособенность.

Если вы здесь желая преобразовать setuptoolsв distutilsкак я:

  1. удалите install_requiresиз setup.py и просто используйте requirements.txt сpip
  2. измените код entry_pointsна scripts( doc ) и entry_pointsпроведите рефакторинг любых модулей, полагающихся на полные скрипты с shebangs и точкой входа.
Карстен
источник
Пытаюсь понять, какой пакет рекомендуется. Вы пишете «использовать только функции distutils» и «конвертировать инструменты настройки в distutils», но также заявляете, что «entry_points были только функцией setuptools», это кажется немного противоречивым?
chrisinmtown 08
2

Насколько я могу судить, это ошибка в setuptools, при которой не удаляются определенные параметры setuptools перед вызовом базового класса в стандартной библиотеке: https://bitbucket.org/pypa/setuptools/issue/29 / escape-userwarnings-emitted-when-call

Если у вас есть безусловное import setuptoolsв вашем setup.py(как и должно быть, если вы используете определенные параметры setuptools), то тот факт, что сценарий не дает сбоев, ImportErrorуказывает на то, что setuptools правильно установлен.

Вы можете отключить предупреждение следующим образом:

python -W ignore::UserWarning:distutils.dist setup.py <any-other-args>

Делайте это только в том случае, если вы используете безусловный импорт, который полностью завершится неудачно, если не установлены инструменты установки :)

(Я наблюдаю такое же поведение при оформлении заказа из репозитория setuptools после слияния, поэтому я уверен, что это ошибка setuptools, а не проблема конфигурации системы. Я ожидаю, что распространение до слияния будет иметь ту же проблему)

ncoghlan
источник
0

Теперь я видел это в устаревших инструментах, использующих Python2.7, где сборка (например, Dockerfile) устанавливает незакрепленную зависимость, например pytest. PyTest отказался от поддержки Python 2.7, поэтому вам может потребоваться указать version <выпуск нового пакета.

Или прикусите пулю и конвертируйте это приложение в Python 3, если это возможно.

Дэнни Стейпл
источник