python setuptools pip distribute setup.py

python - ¿Cuándo usar el archivo de requisitos pip versus install_requires en setup.py?



setuptools distribute (4)

Estoy usando pip con virtualenv para empaquetar e instalar algunas bibliotecas de Python.

Me imagino que lo que estoy haciendo es un escenario bastante común. Soy el mantenedor de varias bibliotecas para las que puedo especificar las dependencias de forma explícita. Algunas de mis bibliotecas dependen de bibliotecas de terceros que tienen dependencias transitivas sobre las cuales no tengo control.

Lo que intento lograr es una pip install en una de mis bibliotecas para descargar / instalar todas sus dependencias ascendentes. Lo que estoy luchando con la documentación de pip es si / cómo los archivos de requisitos pueden hacer esto por sí mismos o si realmente son solo un complemento al uso de install_requires .

¿Utilizaría install_requires en todas mis bibliotecas para especificar dependencias y rangos de versiones y luego solo usaré un archivo de requisitos para resolver un conflicto y / o congelarlos para una compilación de producción?

Imaginemos que vivo en un mundo imaginario (lo sé, lo sé) y mis dependencias en la etapa inicial son sencillas y está garantizado que nunca entrarán en conflicto ni romperán la compatibilidad con versiones anteriores. ¿Me veré obligado a usar un archivo de requisitos de pip o simplemente dejar que pip / setuptools / distribute instale todo en función de install_requires ?

Hay muchas preguntas similares aquí, pero no pude encontrar ninguna que fuera tan básica como cuándo usar una u otra o usarlas juntas de forma armoniosa.


La Guía del usuario de Python Packaging tiene una página sobre este tema, le recomiendo que la lea:

Resumen:

install_requires está ahí para enumerar las dependencias del paquete que absolutamente debe instalarse para que el paquete funcione. No está destinado a fijar las dependencias a versiones específicas, pero se aceptan rangos, por ejemplo install_requires=[''django>=1.8''] . install_requires es observado por pip install name-on-pypi y otras herramientas.

requirements.txt es solo un archivo de texto, que puede elegir ejecutar pip install -r requirements.txt contra. Está destinado a tener versiones de todas las dependencias y subdependencias fijadas, como esta: django==1.8.1 . Puedes crear uno usando pip freeze > requirements.txt . (Algunos servicios, como Heroku, ejecutan automáticamente pip install -r requirements.txt para usted). pip install name-on-pypi no mira los requirements.txt , solo en install_requires .


Mi filosofía es que install_requires debe indicar un mínimo de lo que necesita. Puede incluir requisitos de versión si sabe que algunas versiones no funcionarán; pero no debe tener requisitos de versión en los que no esté seguro (por ejemplo, no está seguro de si una versión futura de una dependencia romperá su biblioteca o no).

Por otro lado, los archivos de requisitos deben indicar lo que sabe que funciona, y pueden incluir dependencias opcionales que recomiende. Por ejemplo, puede usar SQLAlchemy pero sugerir MySQL, y así poner MySQLdb en el archivo de requisitos).

Entonces, en resumen: install_requires es para mantener a las personas alejadas de cosas que usted sabe que no funcionan, mientras que los archivos de requisitos llevan a las personas a cosas que usted sabe que funcionan. Una razón para esto es que los requisitos de install_requires siempre se verifican y no se pueden deshabilitar sin cambiar los metadatos del paquete. Entonces no puedes probar una nueva combinación fácilmente. Los archivos de requisitos solo se verifican en el momento de la instalación.


Solo uso setup.py e install_requires porque solo hay un lugar para mirar. Es tan poderoso como tener un archivo de requisitos y no hay duplicación para mantener.


esto es lo que puse en mi setup.py:

# this grabs the requirements from requirements.txt REQUIREMENTS = [i.strip() for i in open("requirements.txt").readlines()] setup( ..... install_requires=REQUIREMENTS )