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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

Я просто столкнулся с этой проблемой при попытке построить/установить ansible. Проблема заключается в том, что distutils действительно не поддерживает install_requires. Setuptools должен обезвреживать обезьяны-патча на лету, но это не так, вероятно, потому, что последняя версия setuptools с 2009 года равна 0.6c11, тогда как 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.

Ответ 4

Я на Mac с Python 2.7.11. Я занимался созданием чрезвычайно простых и понятных проектов, где мое единственное требование - я могу запустить python setup.py install, и чтобы setup.py использовал команду setup, в идеале из 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(entry_points ' сбщ)

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

from distutils.core import setup
import setuptools  # noqa

Предупреждения уходят.

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

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


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

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

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

Ответ 5

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

Ответ 6

sudo apt-get install python-dev  # for python2.x installs
sudo apt-get install python3-dev  # for python3.x installs

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

Ответ 7

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

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

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

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

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

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

Ответ 8

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

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

Ответ 9

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

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 и просто используйте needs.txt с pip
  2. замените entry_points на scripts (doc) и измените рефакторинг любых модулей, основанных на entry_points, на полные сценарии с шебангами и точкой входа.