Consulte los requisitos.txt para install_requires kwarg en el archivo setuptools setup.py

Resuelto Louis Thibault asked hace 11 años • 20 respuestas

Tengo un requirements.txtarchivo que estoy usando con Travis-CI. Parece una tontería duplicar los requisitos en ambos requirements.txty setup.py, por lo que esperaba pasar un identificador de archivo al install_requireskwarg en setuptools.setup.

es posible? Si es así, ¿cómo debo hacer para hacerlo?

Aquí está mi requirements.txtarchivo:

guessit>=0.5.2
tvdb_api>=1.8.2
hachoir-metadata>=1.3.3
hachoir-core>=1.3.3
hachoir-parser>=1.3.4
Louis Thibault avatar Jan 18 '13 20:01 Louis Thibault
Aceptado

A primera vista, parece que requirements.txtson setup.pyduplicados tontos, pero es importante comprender que si bien la forma es similar, la función prevista es muy diferente.

El objetivo del autor de un paquete, al especificar dependencias, es decir "dondequiera que instale este paquete, estos son los otros paquetes que necesita para que este paquete funcione".

En contraste, el autor de la implementación (que puede ser la misma persona en un momento diferente) tiene un trabajo diferente, ya que dice "aquí está la lista de paquetes que hemos reunido y probado y que ahora necesito instalar".

El autor del paquete escribe para una amplia variedad de escenarios, porque están exponiendo su trabajo para que se utilice de maneras que tal vez no conozcan y no tienen forma de saber qué paquetes se instalarán junto con su paquete. Para ser un buen vecino y evitar conflictos de versiones de dependencia con otros paquetes, deben especificar una gama de versiones de dependencia tan amplia como sea posible. Esto es lo que install_requireshace setup.py.

El autor de la implementación escribe para un objetivo muy diferente y muy específico: una única instancia de una aplicación o servicio instalado, instalado en una computadora en particular. Para controlar con precisión una implementación y asegurarse de que se prueben e implementen los paquetes correctos, el autor de la implementación debe especificar la versión exacta y la ubicación de origen de cada paquete que se instalará, incluidas las dependencias y las dependencias de las dependencias. Con esta especificación, una implementación se puede aplicar repetidamente a varias máquinas o probarse en una máquina de prueba, y el autor de la implementación puede estar seguro de que se implementan los mismos paquetes cada vez. Esto es lo que requirements.txthace.

Entonces puedes ver que, si bien ambos parecen una gran lista de paquetes y versiones, estas dos cosas tienen funciones muy diferentes. ¡Y definitivamente es fácil mezclar esto y equivocarse! Pero la forma correcta de pensar en esto es que requirements.txtes una "respuesta" a la "pregunta" planteada por los requisitos en todos los setup.pyarchivos de paquetes. En lugar de escribirlo a mano, a menudo se genera diciéndole a pip que mire todos los setup.pyarchivos en un conjunto de paquetes deseados, encuentre un conjunto de paquetes que crea que se ajustan a todos los requisitos y luego, después de instalarlos, "congelar". "esa lista de paquetes en un archivo de texto (de aquí pip freezeproviene el nombre).

Entonces la conclusión:

  • setup.pydebe declarar las versiones de dependencia más flexibles posibles que aún sean viables. Su trabajo es decir con qué puede funcionar un paquete en particular.
  • requirements.txtes un manifiesto de implementación que define un trabajo de instalación completo y no debe considerarse vinculado a ningún paquete en particular. Su trabajo es declarar una lista exhaustiva de todos los paquetes necesarios para que una implementación funcione.
  • Debido a que estas dos cosas tienen contenidos y razones de existencia tan diferentes, no es factible simplemente copiar una en la otra.

Referencias:

  • install_requires vs archivos de requisitos de la guía del usuario del empaquetado de Python.
Jonathan Hanson avatar Nov 13 '2015 04:11 Jonathan Hanson

Puede darle la vuelta y enumerar las dependencias setup.pyy tener un solo carácter, un punto ., en requirements.txtsu lugar.


Alternativamente, incluso si no se recomienda, aún es posible analizar el requirements.txtarchivo (si no hace referencia a ningún requisito externo por URL) con el siguiente truco (probado con pip 9.0.1):

install_reqs = parse_requirements('requirements.txt', session='hack')

Sin embargo , esto no filtra los marcadores ambientales .


En versiones antiguas de pip, más específicamente anteriores a la 6.0 , existe una API pública que se puede utilizar para lograr esto. Un archivo de requisitos puede contener comentarios ( #) y puede incluir algunos otros archivos ( --requiremento -r). Por lo tanto, si realmente desea analizar un, requirements.txtpuede utilizar el analizador de pip:

from pip.req import parse_requirements

# parse_requirements() returns generator of pip.req.InstallRequirement objects
install_reqs = parse_requirements(<requirements_path>)

# reqs is a list of requirement
# e.g. ['django==1.5.1', 'mezzanine==1.4.6']
reqs = [str(ir.req) for ir in install_reqs]

setup(
    ...
    install_requires=reqs
)
Romain Hardouin avatar May 18 '2013 13:05 Romain Hardouin