¿Diferencia entre extras_require () y install_requires () en setup.py?

Estoy tratando de entender la diferencia entre extras_require() y install_requires() en setup.py pero no pude conseguirlo. Ambos se utilizan para instalar dependencias de Python, pero ¿cuál es la diferencia entre ellos?

Según la documentación de setuptools ,

extras_require
Un diccionario que asigna nombres de “extras” (características opcionales de su proyecto) a cadenas o listas de cadenas que especifican qué otras distribuciones deben instalarse para admitir esas características.

y

install_requires
Una cadena o lista de cadenas que especifique qué otras distribuciones deben instalarse cuando esta es.

La sección sobre Declaración de “Extras” (características opcionales con sus propias dependencias) desarrolla esto:

A veces, un proyecto tiene dependencias “recomendadas”, que no son necesarias para todos los usos del proyecto. Por ejemplo, un proyecto podría ofrecer una salida PDF opcional si ReportLab está instalado, y el soporte de texto reStructured si está instalado docutils. Estas funciones opcionales se denominan “extras”, y setuptools también le permite definir sus requisitos. De esta manera, otros proyectos que requieren estas características opcionales pueden forzar la instalación de requisitos adicionales, al nombrar los extras deseados en sus requisitos de instalación.

La mayor diferencia es que los requisitos en extras_require solo se instalan según sea necesario:

Estos requisitos no se instalarán automáticamente a menos que otro paquete dependa de ellos (directa o indirectamente) al incluir los “extras” deseados entre corchetes después del nombre del proyecto asociado. (O si los extras se enumeraron en una especificación de requisitos en la línea de comandos de EasyInstall).

Así que para resumir:

  • Si la dependencia es necesaria para ejecutar su proyecto, póngala en install_requires . Siempre serán instalados.
  • Si su proyecto tiene características opcionales que agregan dependencias, coloque esas dependencias en extras_require . Esas dependencias no se instalarán a menos que el usuario u otro paquete solicite esa característica.

No estoy seguro del uso oficial, pero uso extras_require() para especificar dependencias condicionales.

En mi caso –

 extras_require={":python_version<'3.5'": ["scandir"]} 

Teóricamente, esto debería estar disponible a través de install_requires() sí mismo, pero solo funciona como debería al iniciar la versión X.XX (varias afirmaciones sobre qué versión comienza a funcionar correctamente) de setuptools .

Este artículo lo explica muy bien: Dependencias condicionales de Python