Avviso utente pypi: opzione di distribuzione sconosciuta: "install_requires"


112

Qualcuno incontra questo avviso durante l'esecuzione python setup.py installdi un pacchetto PyPI?

install_requiresdefinisce cosa richiede il pacchetto. Molti pacchetti PyPI hanno questa opzione. Come può essere una "opzione di distribuzione sconosciuta"?


1
Possibile duplicato
dell'aggiunta

@ tripleee forse, ma questa domanda è stata posta prima di quella.
Tyler Long

L'età delle domande è una preoccupazione secondaria, ma non ho una forte opinione in entrambi i casi. Se desideri che la nomina duplicata vada al contrario, potresti creare una domanda Meta Stack Overflow per visibilità. Per me personalmente, la risposta accettata dell'altra domanda mi ha aiutato di più, perché è più diretta e mirata. Sembra che tu non abbia mai accettato nessuna di queste risposte, quindi è un fattore che potresti effettivamente cambiare.
tripleee

1
@tripleee se leggi attentamente questo thread ti renderai conto che non c'è affatto una risposta perfetta. Quindi non so quale risposta accettare. Non voglio fuorviare le persone selezionando una risposta che non riesco nemmeno a convincere me stesso.
Tyler Long

Risposte:


89

python setup.pyusa distutils che non supporta install_requires. setuptools lo fa, distribuisce anche (il suo successore) e pip (che usa entrambi) lo fa. Ma in realtà devi usarli. Cioè chiamare setuptools tramite il easy_installcomando o pip install.

Un altro modo è importare il setup da setuptools nel tuo setup.py, ma questo non è standard e fa sì che tutti coloro che desiderano utilizzare il tuo pacchetto debbano avere setuptools installato.


3
Diciamo che voglio usare pip, quindi come faccio a eseguire il setup.pyfile se voglio solo creare un'estensione sul posto?
Fred Foo

11
L'avviso non ti impedisce di impacchettare il codice, quindi puoi eseguirlo python setup.py sdiste installarlo con pip install resulting_package.tar.gz. Puoi anche usare pip install -eper installare direttamente dai sorgenti, ma ho sempre preferito installare dal pacchetto o direttamente dal repository ..
Sebastian Blask

Questo è un po 'incasinato. Puoi sempre provare a importare prima il setup da setuptools, altrimenti vai con distutils e ricevi l'avviso. Se è in pypy, tuttavia, potresti finire con "Troppi file aperti" a causa di setuptools che non chiude correttamente i descrittori (anche su Debian, con il valore predefinito ulimit -n di 1024): bugs.pypy.org/issue878
fiorix

1
Vedi la mia risposta: per quanto ne so, questo è solo un bug in setuptools. L'utente non sta facendo nulla di sbagliato, setuptools lo è.
ncoghlan

Questo risponde indirettamente alla mia domanda: ho ricevuto l'errore come risultato della corsa pip install pendulum==1.4.4. L'esecuzione ha pip install setuptools --upgradecancellato l'errore.
Conto buttato via

32

Questo è stato il primo risultato della mia ricerca su Google, ma non ho avuto risposta. Ho scoperto che l'aggiornamento di setuptools ha risolto il problema per me (e pip per buona misura)

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

Spero che questo aiuti la prossima persona a trovare questo collegamento!


Questo ha risolto anche per me. (Python 3.4, provando a pip3 install neovim-remote.)
Michael Iles

Questo ha funzionato per me. Stavo cercando di installare mako su Python 2.7.16. Hai un'opzione di distribuzione sconosciuta simile. Pip era OK ma setuptools è andato a 41.0.1 da 40.6.2. Quindi Mako ha installato A-OK.
Max Yaffe

18

ATTENZIONE ! ATTENZIONE ! Risposta imperfetta avanti. Per ottenere l '"ultimo promemoria" sullo stato del packaging nell'universo Python, leggi questo saggio abbastanza dettagliato .

Ho appena riscontrato questo problema durante il tentativo di compilare / installare ansible. Il problema sembra essere che distutils in realtà non supporta install_requires. Setuptools dovrebbe eseguire la scimmia-patch di distutils al volo, ma non lo fa, probabilmente perché l'ultima versione di setuptools è 0.6c11 del 2009, mentre distutils è un progetto centrale di Python.

Quindi, anche dopo aver installato manualmente setuptools-0.6c11-py2.7.egg, eseguire setup.py raccoglie solo distutils dist.py, e non quello da site-packages / setuptools /.

Anche la documentazione di setuptools suggerisce di usare ez_setup e non distutils.

Tuttavia, setuptools è esso stesso fornito da distribute al giorno d'oggi, e quel tipo di setup () supporta install_requires.


1
Downvoted, poiché questa risposta contiene un po 'di disinformazione e confusione su cosa siano le diverse cose. ez_setup.py, ad esempio, è un programma di installazione bootstrap per setuptools e non è qualcosa che si userebbe "invece di" distutils. La maggior parte dei pacchetti PyPI non sono "semplicemente sbagliati".
Iguananaut

1
@Iguananaut, grazie per aver esaminato la risposta; L'ho modificato.
PAStheLoD

Oh bene, grazie. In questo caso, voterò di nuovo :) Il saggio di Nick Coghlan a cui ti sei collegato è quello che ho condiviso con i miei colleghi prima di cercare di convincerli a capire questa roba.
Iguananaut

Grande saggio sullo stato delle cose nel marzo 2013. Una domanda ... L'autore afferma: "I progetti setuptoolse distributesono in procinto di riunirsi di nuovo, ma la fusione non è ancora completa (aggiornerò questo saggio non appena che cambia). " Qualcuno sa qual è lo stato delle cose fino al 2019? Con la data di fine vita di Python 2.7 che si avvicina rapidamente, molti pacchetti Python saranno in fase di aggiornamento e reimballaggio.
TrinitronX

16

Sono su un Mac con Python 2.7.11. Ho giocato con la creazione di progetti estremamente semplici e diretti, in cui il mio unico requisito è che posso eseguire python setup.py installe setup.pyutilizzare il comando di installazione, idealmente da distutils. Non ci sono letteralmente altre importazioni o codici a parte i kwargs a parte setup()ciò che ho notato qui.

Ottengo l'errore quando le importazioni per il mio setup.pyfile sono:

from distutils.core import setup

Quando lo uso, ricevo avvisi come

/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: UserWarning: opzione di distribuzione sconosciuta: 'entry_points' warnings.warn ( msg)

Se cambio le importazioni (e nient'altro ) come segue:

from distutils.core import setup
import setuptools  # noqa

Gli avvertimenti scompaiono.

Nota che non lo sto usando setuptools, solo importandolo cambia il comportamento in modo tale che non emetta più gli avvisi. Per me, questa è la causa di una differenza davvero sconcertante in cui alcuni progetti che sto utilizzando forniscono quegli avvertimenti e altri no.

Chiaramente, una qualche forma di patch di scimmia è in corso, ed è influenzata dal fatto che l'importazione venga eseguita o meno. Questa probabilmente non è la situazione per tutti coloro che cercano questo problema, ma per l'ambiente ristretto in cui sto lavorando, questa è la risposta che stavo cercando.


Questo è coerente con l'altro commento (della comunità), che afferma che distutils dovrebbe eseguire il Monkeypatch setuptools e che avevano il problema durante l'installazione di Ansible. Ansible sembra aver provato a consentire le installazioni senza avere setuptools in passato, e poi è tornato su quello.

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

Un sacco di cose sono nell'aria ... ma se stai cercando una risposta semplice per un progetto semplice, dovresti probabilmente importare semplicemente setuptools.


1
L'aggiunta ha import setuptoolsanche risolto miracolosamente il problema per me su Ubuntu 16.04 con Python 3.5.
kuropan

8

Questo è un avvertimento di distutils ed è un segno che non hai setuptools installato. L'installazione da http://pypi.python.org/pypi/setuptools rimuoverà l'avviso.


32
setuptools è installato. ha ancora l'avvertimento.
Tyler Long,

Hai ragione, ottengo questo errore in Python 2.6.6 anche se setuptools o distribute è installato. Se provo con 2.7.2 non c'è più.
Fredrik Håård,

4
Sto riscontrando questo problema in Python 2.7.3
Calvin Cheng

2
Questo ha funzionato per me: wget bootstrap.pypa.io/ez_setup.py -O - ​​| sudo python
radtek

Grazie, @radtek, anche per me ha funzionato. Forse potresti trasformare il tuo commento in una risposta?
Esteis

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

Installerà tutte le intestazioni mancanti. Ha risolto il mio problema


4

In conclusione :

distutilsnon supporta install_requireso entry_points, setuptoolsfa.

cambiamento from distutils.core import setupin setup.py per from setuptools import setupo refactoring tuo setup.py di utilizzare solo distutilscaratteristiche.

Sono venuto qui perché non mi ero reso conto che entry_pointsfosse solo una setuptoolscaratteristica.

Se vuoi convertirti setuptoolsin distutilscome me:

  1. rimuovere install_requiresda setup.py e utilizzare solo requirements.txt conpip
  2. cambia entry_pointsin scripts( doc ) e refactoring tutti i moduli che si basano su entry_pointscome script completi con shebang e un punto di ingresso.

Sto cercando di capire qual è il pacchetto consigliato. Scrivi "usa solo caratteristiche distutils" anche "converti setuptools in distutils", ma dichiari anche "entry_points era solo una caratteristica setuptools", sembra leggermente contraddittorio?
chrisinmtown

2

Per quanto ne so, questo è un bug in setuptools in cui non rimuove le opzioni specifiche di setuptools prima di chiamare la classe base nella libreria standard: https://bitbucket.org/pypa/setuptools/issue/29 / Evita-userwarnings-emessi-quando-chiamata

Se hai un'opzione incondizionata import setuptoolsnel tuo setup.py(come dovresti se usi le opzioni specifiche di setuptools), il fatto che lo script non fallisca ImportErrorindica che setuptools è installato correttamente.

È possibile silenziare l'avviso come segue:

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

Fallo solo se usi l'importazione incondizionata che fallirà completamente se setuptools non è installato :)

(Sto vedendo questo stesso comportamento in un checkout dal repository setuptools post-fusione, motivo per cui sono sicuro che sia un bug di setuptools piuttosto che un problema di configurazione del sistema. Mi aspetto che la distribuzione pre-merge avrebbe lo stesso problema)


0

Ora l'ho visto in strumenti legacy che utilizzano Python2.7, dove una build (come un Dockerfile) installa una dipendenza non appuntata, ad esempio pytest. PyTest ha abbandonato il supporto per Python 2.7, quindi potrebbe essere necessario specificare la versione <del nuovo rilascio del pacchetto.

Oppure stringi i denti e converti l'app in Python 3, se possibile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.