python - require.txt vs setup.py
requirements.txt (3)
En aras de la exhaustividad, así es como lo veo en 3 ángulos diferentes.
- Sus propósitos de diseño son diferentes.
Esta es la descripción precisa citada de la documentación oficial (énfasis mío):
Mientras que install_requires (en setup.py) define las dependencias para un solo proyecto , los archivos de requisitos a menudo se utilizan para definir los requisitos para un entorno completo de Python .
Mientras que los requisitos de install_requires son mínimos, los archivos de requisitos a menudo contienen una lista exhaustiva de versiones ancladas con el fin de lograr instalaciones repetibles de un entorno completo.
Pero aún puede no ser fácil de entender, por lo que en la siguiente sección, hay 2 ejemplos de hechos para demostrar cómo se supone que se deben usar los 2 enfoques, de manera diferente.
-
Por lo tanto, sus usos reales son (se supone que son) diferentes
-
Si su proyecto
foo
se lanzará como una biblioteca independiente (lo que significa que otros probablementeimport foo
), entonces usted (y sus usuarios intermedios) querrían tener una declaración flexible de dependencia, para que su biblioteca no (y no debe) ser "exigente" acerca de qué versión exacta de SUS dependencias debería ser. Entonces, típicamente, su setup.py contendría líneas como esta:install_requires=[ ''A>=1,<2'', ''B>=2'' ]
-
Si solo quiere "documentar" o "anclar" su entorno actual EXACTO para su
bar
aplicaciones, lo que significa que usted o sus usuarios desearían usar subar
aplicaciones tal como está, es decir, ejecutarpython bar.py
, es posible que desee congele su entorno para que siempre se comporte igual. En tal caso, su archivo de requisitos se vería así:A==1.2.3 B==2.3.4 # It could even contain some dependencies NOT strickly required by your library pylint==3.4.5
-
-
En realidad, ¿cuál uso?
-
Si está desarrollando una
bar
aplicaciones que será utilizada porpython bar.py
, incluso si eso es "solo un script para divertirse", aún así se le recomienda usar require.txt porque, quién sabe, la próxima semana (que es Navidad) ) recibiría una nueva computadora como regalo, por lo que necesitaría configurar su entorno exacto allí nuevamente. -
Si está desarrollando una biblioteca
foo
que será utilizada porimport foo
, debe preparar un setup.py. Período. Pero aún puede optar por proporcionar también requisitos.txt al mismo tiempo, que puede:(a) ya sea en el estilo
A==1.2.3
(como se explica en el # 2 anterior);(b) o simplemente contiene un sencillo mágico
.
.
lo que sería más o menos igual a "instalar los requisitos basados en setup.py" sin duplicación. Personalmente, considero que este último enfoque desdibuja la línea, aumenta la confusión y NO agrega realmente valor, pero no obstante es un truco derivado de un enfoque mencionado por el mantenedor de paquetes de Python Donald en su publicación de blog .
-
Empecé a trabajar con Python.
setup.py
requirements.txt
y
setup.py
a mi proyecto.
Pero, todavía estoy confundido sobre el propósito de ambos archivos.
He leído que
setup.py
está diseñado para cosas redistribuibles y que
setup.py
está diseñado para cosas no redistribuibles.
Pero no estoy seguro de que esto sea exacto.
¿Cómo están realmente destinados a usarse esos dos archivos?
La respuesta corta es que
requirements.txt
es solo para listar los requisitos del paquete.
setup.py
por otro lado es más como un script de instalación.
Si no planea instalar el código de Python, normalmente solo necesitará
requirements.txt
.
El archivo
setup.py
describe, además de las dependencias del paquete, el conjunto de archivos y módulos que deben empaquetarse (o compilarse, en el caso de módulos nativos (es decir, escritos en C)), y metadatos para agregar a Python listados de paquetes (por ejemplo, nombre del paquete, versión del paquete, descripción del paquete, autor, ...).
Debido a que ambos archivos enumeran las dependencias, esto puede generar un poco de duplicación. Lea a continuación para más detalles.
requerimientos.txt
Este archivo enumera los requisitos del paquete de Python.
Es un archivo de texto sin formato (opcionalmente con comentarios) que enumera las
dependencias
del paquete de su proyecto de Python (una por línea).
No describe la forma en que se instala su paquete de Python.
En general, consumiría el archivo de requisitos con
pip install -r requirements.txt
.
El nombre de archivo del archivo de texto es arbitrario, pero a menudo es
requirements.txt
por convención.
Al explorar los repositorios de código fuente de otros paquetes de Python, puede tropezar con otros nombres, como
dev-dependencies.txt
o
dependencies-dev.txt
.
Esos tienen el mismo propósito que
dependencies.txt
pero generalmente enumeran dependencias adicionales de interés para los desarrolladores del paquete en particular, es decir, para probar el código fuente (por ejemplo, pytest, pylint, etc.) antes del lanzamiento.
Los usuarios del paquete generalmente no necesitarían todo el conjunto de dependencias del desarrollador para ejecutar el paquete.
Si
requirements-X.txt
múltiples variantes de
requirements-X.txt
, generalmente una
requirements-X.txt
las dependencias de tiempo de ejecución y la otra, el tiempo de compilación o las dependencias de prueba.
Algunos proyectos también conectan en cascada su archivo de requisitos, es decir, cuando un archivo de requisitos incluye otro archivo (
example
).
Hacerlo puede reducir la repetición.
setup.py
Este es un script de Python que utiliza el módulo
setuptools
para definir un paquete de Python (nombre, archivos incluidos, metadatos del paquete e instalación).
Al igual que
requirements.txt
, también enumerará las dependencias de tiempo de ejecución del paquete.
Setuptools es la forma de facto de construir e instalar paquetes de Python, pero tiene sus defectos, que con el tiempo han dado lugar al desarrollo de nuevos "administradores de metapaquete", como pip.
Los defectos de ejemplo de setuptools son su incapacidad para instalar múltiples versiones del mismo paquete y la falta de un comando de desinstalación.
Cuando un usuario de Python realiza
pip install ./pkgdir_my_module
(o
pip install my-module
), pip ejecutará
setup.py
en el directorio (o módulo) dado.
Del mismo modo, cualquier módulo que tenga un
setup.py
puede instalarse con
pip
, por ejemplo, ejecutando
pip install .
de la misma carpeta
¿Realmente necesito ambos?
La respuesta corta es no, pero es bueno tener ambas. Alcanzan diferentes propósitos, pero ambos pueden usarse para enumerar sus dependencias.
Hay un truco que puede considerar para evitar duplicar su lista de dependencias entre
setup.py
y
setup.py
.
Si ya ha escrito un
setup.py
completamente funcional para su paquete, y sus dependencias son en su mayoría externas, podría considerar tener un simple
requirements.txt
con solo lo siguiente:
# requirements.txt
#
# installs dependencies from ./setup.py, and the package itself,
# in editable mode
-e .
# (the -e above is optional). you could also just install the package
# normally with just the line below (after uncommenting)
# .
El
-e
es una opción especial de
pip install
que instala el paquete dado en modo
editable
.
Cuando
pip -r requirements.txt
se ejecuta en este archivo, pip instalará sus dependencias a través de la lista en
./setup.py
.
La opción editable colocará un enlace simbólico en su directorio de instalación (en lugar de un huevo o una copia archivada).
Permite a los desarrolladores editar el código en su lugar desde el repositorio sin reinstalar.
También puede aprovechar lo que se llama "setuptools extras" cuando tiene ambos archivos en su repositorio de paquetes. Puede definir paquetes opcionales en setup.py bajo una categoría personalizada e instalar esos paquetes solo de esa categoría con pip:
# setup.py
from setuptools import setup
setup(
name="FOO"
...
extras_require = {
''dev'': [''pylint''],
''build'': [''requests'']
}
...
)
y luego, en el archivo de requisitos:
# install packages in the [build] category, from setup.py
# (path/to/mypkg is the directory where setup.py is)
-e path/to/mypkg[build]
Esto mantendría todas sus listas de dependencias dentro de setup.py.
Nota
: Normalmente ejecutaría pip y setup.py desde un sandbox, como los creados con el programa
virtualenv
.
Esto evitará instalar paquetes de Python fuera del contexto del entorno de desarrollo de su proyecto.
requerimientos.txt
Esto le ayuda a configurar su entorno de desarrollo.
Programas como
pip
se pueden usar para instalar todos los paquetes enumerados en el archivo de una sola vez.
Después de eso, puede comenzar a desarrollar su script de Python.
Especialmente útil si planea que otros contribuyan al desarrollo o usen entornos virtuales.
Así es como lo usas:
pip install -r < requirements.txt
setup.py
Esto le permite crear paquetes que puede redistribuir.
Este script está destinado a instalar su paquete en el sistema del usuario final, no a preparar el entorno de desarrollo como lo hace
pip install -r < requirements.txt
.
Consulte
esta respuesta
para obtener más detalles sobre setup.py.
Las dependencias de su proyecto se enumeran en ambos archivos.