La respuesta corta es que solo requirements.txt
sirve para enumerar 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 los módulos nativos (es decir, escritos en C)) y los metadatos para agregar a las listas de paquetes de Python ( por ejemplo, nombre del paquete, versión del paquete, descripción del paquete, autor, ...).
Debido a que ambos archivos enumeran dependencias, esto puede conducir a un poco de duplicación. Lea a continuación para obtener más detalles.
requirements.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). Que no describen la manera en la que está instalado el paquete python. Por lo general, consumiría el archivo de requisitos con pip install -r requirements.txt
.
El nombre del archivo de texto es arbitrario, pero a menudo es requirements.txt
por convención. Al explorar repositorios de código fuente de otros paquetes de Python, es posible que se encuentre con otros nombres, como dev-dependencies.txt
o dependencies-dev.txt
. Aquellos 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 hay varias requirements-X.txt
variantes, normalmente una enumerará 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 ( ejemplo ). Hacerlo puede reducir la repetición.
setup.py
Este es un script de Python que usa el setuptools
módulo para definir un paquete de Python (nombre, archivos incluidos, metadatos del paquete e instalación). Será, como requirements.txt
, también la lista de ejecución dependencias del paquete. Setuptools es la forma de facto de construir e instalar paquetes de Python, pero tiene sus deficiencias, que con el tiempo han hecho surgir el desarrollo de nuevos "administradores de metapaquetes", como pip. Ejemplos de deficiencias 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 lo hace pip install ./pkgdir_my_module
(o pip install my-module
), pip se ejecutará setup.py
en el directorio (o módulo) dado. De manera similar, cualquier módulo que tenga un setup.py
se puede pip
instalar, por ejemplo, ejecutándolo pip install .
desde la misma carpeta.
¿Realmente necesito ambos?
La respuesta corta es no, pero es bueno tener ambos. Logran 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 requirements.txt
y setup.py
. Si ya ha escrito un setup.py
paquete que funcione completamente 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 especial pip install
opción que instala el paquete dado en editable modo. 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 código en su lugar desde el repositorio sin reinstalarlo.
También puede aprovechar lo que se llama "extras de setuptools" cuando tiene ambos archivos en su repositorio de paquetes. Puede definir paquetes opcionales en setup.py en una categoría personalizada e instalar esos paquetes solo desde 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 una caja de arena, como las creadas con el programa virtualenv
. Esto evitará instalar paquetes de Python fuera del contexto del entorno de desarrollo de su proyecto.