pypi UserWarning: Невідомий параметр розповсюдження: 'install_requires'


112

Хтось стикається з цим попередженням під час виконання python setup.py installпакету PyPI?

install_requiresвизначає, що вимагає пакет. Багато пакетів PyPI мають цю опцію. Як це може бути "невідомий варіант розподілу"?



@tripleee, можливо, але це питання було задано раніше, ніж це.
Тайлер Лонг

Вік питань є другорядним питанням, але я не маю жодної сильної думки. Якщо ви хочете, щоб повторна номінація пішла навпаки, можливо, створіть питання щодо переповнення Meta Stack для наочності. Особисто для мене прийнята відповідь на інше питання мені більше допомогла, бо вона більш пряма і цілеспрямована. Здається, ви ніколи не приймали жодної з цих відповідей, тож це фактор, який ви могли насправді змінити.
tripleee

1
@tripleee якщо уважно прочитати цю тему, то зрозумієш, що ідеальної відповіді взагалі немає. Тож я не знаю, яку відповідь прийняти. Я не хочу вводити людей в оману, обираючи відповідь, яка навіть не можу переконати себе.
Тайлер Лонг

Відповіді:


89

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

Інший спосіб - імпортувати налаштування з setuptools у вашому setup.py, але це не стандартно, і всі, хто бажає використовувати ваш пакунок, повинні мати встановлені настройки.


3
Скажіть, я хочу використовувати pip, то як мені запустити setup.pyфайл, якщо я хочу створити лише розширення на місці?
Фред Фоо

11
Попередження не перешкоджає упаковці коду, тому ви можете запустити python setup.py sdistта встановити його pip install resulting_package.tar.gz. Ви також можете використовувати pip install -eдля установки безпосередньо з джерела, але я завжди вважав за краще встановлювати з пакету або з сховища безпосередньо ..
Себастьян Бласк

Це трохи заплуталося. Ви завжди можете спробувати імпортувати налаштування спочатку з setuptools, інакше перейдіть за допомогою distutils і отримайте попередження. Якщо він у pypy, однак, можливо, у вас з'явиться "Занадто багато відкритих файлів" через те, що setuptools не закриває дескриптори належним чином (навіть на Debian, за замовчуванням ulimit -n 1024): bugs.pypy.org/issue878
fiorix

1
Дивіться мою відповідь - наскільки я можу сказати, це лише відверта помилка в setuptools. Користувач не робить нічого поганого, setuptools є.
ncoghlan

Це опосередковано відповідає на моє запитання: я отримав помилку в результаті запуску 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.)
Майкл Ілз

Це працювало для мене. Намагався встановити mako на Python 2.7.16. Отримав подібний варіант невідомого розповсюдження. З Pip було нормально, але setuptools перейшов до 41.0.1 з 40.6.2. Тоді Мако встановив A-OK.
Макс Яффе

18

УВАГА ! УВАГА ! Попереду недосконала відповідь. Щоб отримати "останню примітку" про стан упаковки у Всесвіті Python, прочитайте цей досить докладний нарис .

Я щойно зіткнувся з цією проблемою, намагаючись створити / встановити ansible. Здається, проблема полягає в тому, що distutils дійсно не підтримує install_requires. Setuptools повинен мавпа-патч дистрибутивів на ходу, але це не так, мабуть, тому, що останній випуск setuptools становить 0,6c11 з 2009 року, тоді як distutils - це основний проект Python.

Тож навіть після встановлення setuptools-0.6c11-py2.7.egg, встановленого setup.py вручну, вибирає тільки distutils dist.py, а не той, який використовується з сайту-пакети / setuptools /.

Також документація setuptools натякає на використання ez_setup, а не distutils.

Однак налаштування setptools тепер забезпечується дистрибутивом , і цей аромат setup () підтримує install_requires.


1
Тому що ця відповідь містить деяку дезінформацію та плутанину щодо того, що таке різні речі. Наприклад, ez_setup.py - це інсталятор завантаження для setuptools, і це не те, що можна було б використовувати "замість" distutils. Більшість пакетів PyPI не є "просто неправильним".
Ігуананавт

1
@Iguananaut, дякую за перегляд відповіді; Я це відредагував.
PAStheLoD

О, здорово, дякую. У цьому випадку я повторно подаю заяву :) Нарис Ніка Коглана, з яким ви пов’язані, - це той, з яким я поділився зі своїми колегами, перш ніж спробувати змусити їх обернути голову навколо цього матеріалу.
Ігуананавт

Великий нарис про стан справ в березні 2013 року одне питання ... Автор стверджує: « setuptoolsі distributeпроекти знаходяться в процесі злиття разом, але злиття не завершено поки (я буду оновлювати цю статтю , як тільки що змінюється). " Хтось знає, який зараз стан речей на 2019 рік? Коли дата закінчення життя Python 2.7 швидко наближається, багато пакетів python буде в процесі оновлення та повторної упаковки.
TrinitronX

16

Я на Mac з python 2.7.11. Я грав із створенням надзвичайно простих і простих проектів, де моя єдина вимога - я можу запускати python setup.py installта setup.pyвикористовувати команду настройки, в ідеалі від distutils. Буквально немає іншого імпорту чи коду, окрім того, 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 повинні відслідковувати setuptools, і що вони мали проблему при встановленні Ansible. Здається, Ansible намагався дозволити встановлення, не маючи setuptools в минулому, а потім повернувся до цього.

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

Багато чого в повітрі ... але якщо ви шукаєте просту відповідь на простий проект, вам, ймовірно, слід просто імпортувати налаштування.


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

8

Це попередження від distutils і є знаком того, що у вас не встановлені настройки. Якщо встановити його з http://pypi.python.org/pypi/setuptools , вилучите попередження.


32
встановлюється setuptools. все ще є попередження.
Тайлер Лонг

Ви абсолютно праві, я отримую цю помилку в Python 2.6.6, навіть якщо встановлено setuptools або дистрибутив. Якщо я спробую з 2.7.2, він пропав.
Fredrik Håård

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повні сценарії з шебангами та точкою входу.

Я намагаюся зрозуміти, що таке рекомендований пакет. Ви пишете "використовувати лише функції distutils", також "конвертувати setuptools в distutils", але також заявляєте, що "entry_points була лише функцією setuptools", здається трохи суперечливою?
chrisinmtown

2

Наскільки я можу сказати, це помилка в setuptools, де вона не видаляє конкретні параметри setuptools перед тим, як викликати базовий клас у стандартній бібліотеці: https://bitbucket.org/pypa/setuptools/issue/29 / Avoid-попередження користувачів-випромінюється при дзвінку

Якщо у вас є безумовні import setuptoolsв вашому setup.py(як слід , якщо з допомогою Setuptools конкретних варіантів), то факт , що сценарій не підведе з ImportErrorуказует на те, що Setuptools правильно встановлений.

Ви можете замовкнути попередження так:

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

Тільки робити це , якщо ви використовуєте безумовний імпорт , який буде повністю вийде з ладу , якщо Setuptools не встановлено :)

(Я бачу таку саму поведінку в касі з репо-репортажу після злиття, тому я впевнений, що це помилка setuptools, а не проблема конфігурації системи. Я очікую, що подібна передача перед об'єднанням матиме ту саму проблему)


0

Зараз я бачив це в застарілих інструментах, що використовують Python2.7, де збірка (як Dockerfile) встановлює незакріплену залежність, наприклад, pytest. PyTest відмовився від підтримки Python 2.7, тому вам може знадобитися вказати версію <новий випуск пакета.

Або кусайте кулю і перетворіть цю програму на Python 3, якщо це життєздатно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.