En vista de ello, parece que requirements.txty setup.pyson duplicados tontas, pero es importante entender que mientras que la forma es similar, la función prevista es muy diferente.
El objetivo del autor de un paquete, al especificar dependencias, es decir "donde sea que instale este paquete, estos son los otros paquetes que necesita para que este paquete funcione".
Por el contrario, 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 poniendo su trabajo ahí fuera para que lo usen de formas que quizás 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, necesitan especificar una gama tan amplia de versiones de dependencia como pueda funcionar. Esto es lo que install_requiresen setup.pysí.
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 los paquetes correctos se prueben e implementen, 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 la dependencia. 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 los mismos paquetes se implementan cada vez. Esto es lo que requirements.txthace.
Entonces puede ver que, si bien ambos parecen una gran lista de paquetes y versiones, estas dos cosas tienen trabajos 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 diversos setup.pyarchivos de paquete. 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 considere que cumple con todos los requisitos y luego, una vez instalados, "congele "esa lista de paquetes en un archivo de texto (de aquí pip freezeproviene el nombre).
Entonces la comida para llevar:
setup.pydebería declarar las versiones de dependencia más flojas 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. 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 un contenido y razones tan diferentes para existir, no es factible simplemente copiar una en la otra.
Referencias
install_requiresse usa para declarar dependencias en los paquetes que son necesarios para que el paquete funcione y los usa el desarrollador del paquete, mientras querequirements.txtse usa para automatizar la instalación de entornos, lo que permite instalar software adicional y anclar la versión y los administradores de sistemas los usan paquete. Su rol y público objetivo difieren significativamente, por lo que tratar de combinarlos como lo desea OP es un verdadero error de diseño en mi humilde opinión.