python - ¿Diferencia entre entry_points/console_scripts y scripts en setup.py?
package (4)
Básicamente, hay dos formas de instalar las secuencias de comandos de la consola de Python en mi ruta mediante setup.py
:
setup(
...
entry_points = {
''console_scripts'': [
''foo = package.module:func'',
],
}
)
y
setup(
...
scripts = [
''scripts/myscript.sh''
]
)
¿Cuáles son las diferencias? Veo que el primer enfoque me permite elegir un nombre bonito y específico para mi script, pero ¿hay alguna otra diferencia? Diferentes propósitos originales, compatibilidad (setuptools, distutils, ...?), Uso, ...? Estoy bastante confundido y una bonita y elaborada respuesta podría ayudarme (y probablemente también a otros) a entender todo esto.
Actualización: desde que hice la pregunta, PyPA publicó estos documentos geniales sobre el tema .
El enfoque del punto de entrada de las herramientas de configuración (n. ° 1) también tiene la ventaja de que en Windows se creará un .exe que se puede hacer doble clic e invocar como un programa de Windows normal. Esto es además de tener una secuencia de comandos colocada en la ruta del contenedor en los sistemas tipo posix.
Los documentos para el paquete Click (sorprendente) sugieren algunos motivos para usar puntos de entrada en lugar de scripts, incluidos
- compatibilidad multiplataforma y
- evitando que el intérprete asigne
__name__
a__main__
, lo que podría hacer que el código se importe dos veces (si otro módulo importa tu script)
Click es una buena manera de implementar funciones para usar como entry_points
, por cierto.
Una diferencia clave entre estas dos formas de crear ejecutables en línea de comandos es que con el método setuptools
(su primer ejemplo), debe llamar a una función dentro del script; en su caso, esta es la func
dentro de su module
. Sin embargo, en el enfoque de distutils
(su segundo ejemplo) usted llama al script directamente (lo que permite que se incluya en la lista con o sin una extensión).
Una diferencia más es que al usar console_scripts, se ejecutó el archivo init de mi módulo. Cuando solo usamos scripts, el módulo init no se ejecutó, solo se ejecutó el script.