Pypi UserWarning: opción de distribución desconocida: 'install_requires'

112

¿Alguien encuentra esta advertencia al ejecutar python setup.py installun paquete PyPI?

install_requiresdefine lo que requiere el paquete. Muchos paquetes de PyPI tienen esta opción. ¿Cómo puede ser una "opción de distribución desconocida"?

Tyler Long
fuente
@tripleee quizás, pero esta pregunta se hizo antes que esa.
Tyler Long
La edad de las preguntas es una preocupación secundaria, pero no tengo una opinión sólida de ninguna manera. Si desea que la nominación duplicada sea al revés, tal vez cree una pregunta de desbordamiento de metastack para mayor visibilidad. Para mí, personalmente, la respuesta aceptada de la otra pregunta me ayudó más, porque es más directa y enfocada. Parece que nunca has aceptado ninguna de estas respuestas, por lo que ese es un factor que realmente podrías cambiar.
tripleee
1
@tripleee, si lee este hilo con atención, se dará cuenta de que no hay una respuesta perfecta en absoluto. Entonces no sé qué respuesta aceptar. No quiero engañar a la gente seleccionando una respuesta que ni siquiera puedo convencerme.
Tyler Long

Respuestas:

89

python setup.pyusa distutils que no admite install_requires. setuptools lo hace, también distribuye (su sucesor), y pip (que usa cualquiera) lo hace. Pero en realidad tienes que usarlos. Es decir, llame a setuptools a través del easy_installcomando o pip install.

Otra forma es importar la configuración de setuptools en su setup.py, pero esto no es estándar y hace que todos los que quieran usar su paquete deban tener setuptools instalados.

Sebastián Blask
fuente
3
Digamos que quiero usar pip, entonces, ¿cómo ejecuto el setup.pyarchivo si solo quiero crear una extensión en el lugar?
Fred Foo
11
La advertencia no le impide empaquetar su código, por lo que puede ejecutarlo python setup.py sdiste instalarlo con pip install resulting_package.tar.gz. También puede usar pip install -epara instalar directamente desde la fuente, pero siempre he preferido instalar desde el paquete o desde el repositorio directamente ..
Sebastian Blask
Esto está un poco desordenado. Siempre puede intentar importar la configuración desde setuptools primero; de lo contrario, vaya con distutils y obtenga la advertencia. Sin embargo, si está en pypy, podría terminar con "Demasiados archivos abiertos" debido a que las herramientas de configuración no cierran los descriptores correctamente (incluso en Debian, con el ulimit -n predeterminado de 1024): bugs.pypy.org/issue878
fiorix
1
Vea mi respuesta: por lo que puedo decir, esto es solo un error directo en las herramientas de configuración. El usuario no está haciendo nada malo, setuptools sí.
ncoghlan
Esto responde indirectamente a mi pregunta: obtuve el error como resultado de ejecutar pip install pendulum==1.4.4. Correr pip install setuptools --upgradeborró el error.
Throw Away Account
32

Este fue el primer resultado de mi búsqueda en Google, pero no tuvo respuesta. Descubrí que la actualización de las herramientas de configuración me resolvió el problema (y pip por si acaso)

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

¡Espero que esto ayude a la próxima persona a encontrar este enlace!

Mate
fuente
Esto también lo resolvió para mí. (Python 3.4, intentando pip3 install neovim-remote.)
Michael Iles
Esto funcionó para mí. Estaba intentando instalar mako en Python 2.7.16. Obtuve una opción de distribución desconocida similar. Pip estaba bien, pero las herramientas de configuración pasaron a 41.0.1 desde 40.6.2. Entonces Mako instaló A-OK.
Max Yaffe
18

¡ ATENCIÓN ! ¡ ATENCIÓN ! Respuesta imperfecta por delante. Para obtener el "memorando más reciente" sobre el estado del empaquetado en el universo de Python, lea este ensayo bastante detallado .

Me acabo de encontrar con este problema al intentar compilar / instalar ansible. El problema parece ser que distutils realmente no admite install_requires. Setuptools debería parchear distutils sobre la marcha, pero no es así, probablemente porque la última versión de setuptools es 0.6c11 de 2009, mientras que distutils es un proyecto central de Python.

Entonces, incluso después de instalar manualmente setuptools-0.6c11-py2.7.egg, ejecutar setup.py solo recoge distutils dist.py, y no el de site-packages / setuptools /.

Además, la documentación de setuptools sugiere cómo usar ez_setup y no distutils.

Sin embargo, las herramientas de configuración las proporciona distribuir hoy en día, y esa versión de setup () admite install_requires.

PAStheLoD
fuente
1
Votado en contra, ya que esta respuesta contiene cierta desinformación y confusión en cuanto a qué son las diferentes cosas. ez_setup.py, por ejemplo, es un instalador bootstrap para setuptools y no es algo que uno usaría "en lugar de" distutils. La mayoría de los paquetes de PyPI no son "simplemente incorrectos".
Iguananaut
1
@Iguananaut, gracias por revisar la respuesta; Lo he editado.
PAStheLoD
Oh genial, gracias. Volveré a votar en ese caso :) El ensayo de Nick Coghlan al que te vinculaste es uno que he compartido con mis compañeros de trabajo antes para tratar de hacer que entiendan estas cosas.
Iguananaut
Gran ensayo sobre el estado de las cosas en marzo de 2013. Una pregunta ... El autor afirma: "Los proyectos setuptoolsy distributeestán en proceso de fusionarse, pero la fusión aún no está completa (actualizaré este ensayo tan pronto como que cambia) ". ¿Alguien sabe cuál es el estado de las cosas en lo que va de 2019? Con la fecha de fin de vida útil de Python 2.7 acercándose rápidamente, muchos paquetes de Python estarán en proceso de actualización y reempaquetado.
TrinitronX
16

Estoy en una Mac con python 2.7.11. He estado jugando con la creación de proyectos extremadamente simples y directos, donde mi único requisito es que pueda ejecutar python setup.py instally setup.pyusar el comando de configuración, idealmente desde distutils. Literalmente, no hay otras importaciones o códigos aparte de los kwargs que setup()no sean los que anoto aquí.

Recibo el error cuando las importaciones de mi setup.pyarchivo son:

from distutils.core import setup

Cuando utilizo esto, recibo advertencias como

/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: UserWarning: opción de distribución desconocida: 'entry_points' warnings.warn ( msg)

Si cambio las importaciones (y nada más ) a lo siguiente:

from distutils.core import setup
import setuptools  # noqa

Las advertencias desaparecen.

Tenga en cuenta que no lo estoy usando setuptools, solo importarlo cambia el comportamiento de tal manera que ya no emite las advertencias. Para mí, esta es la causa de una diferencia realmente desconcertante en la que algunos proyectos que estoy usando dan esas advertencias y otros no.

Claramente, se está llevando a cabo alguna forma de parcheo, y se ve afectado por si se realiza o no esa importación. Probablemente esta no sea la situación para todos los que investigan este problema, pero para el entorno limitado en el que estoy trabajando, esta es la respuesta que estaba buscando.


Esto es coherente con el otro comentario (de la comunidad), que dice que los distutils deberían instalar las herramientas de configuración de monopatch, y que tenían el problema al instalar Ansible. Ansible parece haber intentado permitir instalaciones sin tener herramientas de configuración en el pasado, y luego volvió a hacerlo.

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

Hay muchas cosas en el aire ... pero si está buscando una respuesta simple para un proyecto simple, probablemente solo debería importar herramientas de configuración.

AlanSE
fuente
1
Agregar import setuptoolstambién resolvió milagrosamente el problema para mí en ubuntu 16.04 con python 3.5.
kuropan
8

Esta es una advertencia de distutils y es una señal de que no tiene instaladas las herramientas de instalación. Instalarlo desde http://pypi.python.org/pypi/setuptools eliminará la advertencia.

Fredrik Håård
fuente
32
setuptools está instalado. todavía tiene la advertencia.
Tyler Long
Tiene razón, obtengo este error en Python 2.6.6 incluso si setuptools o distribuir está instalado. Sin embargo, si intento con 2.7.2, desaparecerá.
Fredrik Håård
4
Tengo este problema en Python 2.7.3
Calvin Cheng
2
Esto lo hizo por mí: wget bootstrap.pypa.io/ez_setup.py -O - ​​| sudo python
radtek
Gracias, @radtek, eso también funcionó para mí. ¿Quizás podrías convertir tu comentario en una respuesta?
Esteis
4
sudo apt-get install python-dev  # for python2.x installs
sudo apt-get install python3-dev  # for python3.x installs

Instalará los encabezados que falten. Resolvió mi problema

Priyanshu Chauhan
fuente
4

En conclusión :

distutilsno soporta install_requireso entry_points, setuptoolslo hace.

cambie from distutils.core import setupen setup.py a from setuptools import setupo refactorice su setup.py para usar solo distutilsfunciones.

Vine aquí porque no me había dado cuenta de que entry_pointsera solo una setuptoolscaracterística.

Si estás aquí queriendo convertirte setuptoolsa distutilsMe gusta:

  1. eliminar install_requiresde setup.py y solo usar requirements.txt conpip
  2. cambie entry_pointsa scripts( doc ) y refactorice cualquier módulo que entry_pointsdependa de que sean scripts completos con shebangs y un punto de entrada.
Karsten
fuente
Estoy tratando de entender cuál es el paquete recomendado. Escribe "use solo características de distutils" y "convierte setuptools en distutils", pero también dice "entry_points era solo una característica de setuptools", ¿parece un poco contradictorio?
chrisinmtown
2

Por lo que puedo decir, este es un error en setuptools en el que no elimina las opciones específicas de setuptools antes de llamar a la clase base en la biblioteca estándar: https://bitbucket.org/pypa/setuptools/issue/29 / evitar-advertencias-del-usuario-emitidas-al-llamar

Si tiene un incondicional import setuptoolsen su setup.py(como debería hacerlo si usa las opciones específicas de setuptools), entonces el hecho de que el script no está fallandoImportError indica que setuptools está instalado correctamente.

Puede silenciar la advertencia de la siguiente manera:

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

Solamente haga esto si usa la importación incondicional que fallará completamente si las herramientas de configuración no están instaladas :)

(Veo este mismo comportamiento en un pago del repositorio de setuptools posterior a la fusión, por lo que estoy seguro de que es un error de setuptools en lugar de un problema de configuración del sistema. Espero que la distribución previa a la fusión tenga el mismo problema)

ncoghlan
fuente
0

Ahora he visto esto en herramientas heredadas que usan Python2.7, donde una compilación (como un Dockerfile) instala una dependencia no fija, por ejemplo, pytest. PyTest ha eliminado la compatibilidad con Python 2.7, por lo que es posible que deba especificar la versión <la nueva versión del paquete.

O muerde la bala y convierta esa aplicación a Python 3 si es viable.

Danny Staple
fuente