Consulte los requisitos.txt para install_requires kwarg en el archivo setuptools setup.py
Tengo un requirements.txt
archivo que estoy usando con Travis-CI. Parece una tontería duplicar los requisitos en ambos requirements.txt
y setup.py
, por lo que esperaba pasar un identificador de archivo al install_requires
kwarg en setuptools.setup
.
es posible? Si es así, ¿cómo debo hacer para hacerlo?
Aquí está mi requirements.txt
archivo:
guessit>=0.5.2
tvdb_api>=1.8.2
hachoir-metadata>=1.3.3
hachoir-core>=1.3.3
hachoir-parser>=1.3.4
A primera vista, parece que requirements.txt
son setup.py
duplicados 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_requires
hace 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.txt
hace.
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.txt
es una "respuesta" a la "pregunta" planteada por los requisitos en todos los setup.py
archivos de paquetes. En lugar de escribirlo a mano, a menudo se genera diciéndole a pip que mire todos los setup.py
archivos 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 freeze
proviene el nombre).
Entonces la conclusión:
setup.py
debe 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.txt
es 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.
Puede darle la vuelta y enumerar las dependencias setup.py
y tener un solo carácter, un punto .
, en requirements.txt
su lugar.
Alternativamente, incluso si no se recomienda, aún es posible analizar el requirements.txt
archivo (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 ( --requirement
o -r
). Por lo tanto, si realmente desea analizar un, requirements.txt
puede 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
)