¿Explicar los puntos de entrada de Python?
He leído la documentación sobre los puntos de entrada de huevos en Pylons y en las páginas de Peak, y todavía no entiendo realmente. ¿Alguien podría explicármelos?
Un "punto de entrada" suele ser una función (u otro objeto similar a una función invocable) que un desarrollador o usuario de su paquete Python podría querer usar, aunque también se puede proporcionar un objeto no invocable como punto de entrada (como correctamente señalado en los comentarios!).
El tipo de punto de entrada más popular es el console_scripts
punto de entrada, que apunta a una función que desea que esté disponible como herramienta de línea de comandos para quien instale su paquete. Esto va en tu setup.py
script como:
entry_points={
'console_scripts': [
'cursive = cursive.tools.cmd:cursive_command',
],
},
Tengo un paquete que acabo de implementar llamado cursive.tools
y quería que tuviera disponible un comando "cursivo" que alguien pudiera ejecutar desde la línea de comando, como:
$ cursive --help
usage: cursive ...
La forma de hacer esto es definir una función, tal vez una cursive_command
función en el archivo cursive/tools/cmd.py
que se vea así:
def cursive_command():
args = sys.argv[1:]
if len(args) < 1:
print "usage: ..."
Etcétera; debe asumir que ha sido llamado desde la línea de comando, analizar los argumentos que el usuario ha proporcionado y... bueno, hacer lo que sea que el comando esté diseñado para hacer.
Instale el docutils
paquete para ver un excelente ejemplo de uso de punto de entrada: instalará algo así como media docena de comandos útiles para convertir la documentación de Python a otros formatos.
Los EntryPoints proporcionan un registro de nombres de objetos persistente basado en un sistema de archivos y un mecanismo de importación directa de objetos basado en nombres (implementado por el paquete setuptools ).
Asocian nombres de objetos de Python con identificadores de forma libre. Entonces, cualquier otro código que use la misma instalación de Python y conozca el identificador puede acceder a un objeto con el nombre asociado, sin importar dónde esté definido el objeto. Los nombres asociados pueden ser cualquier nombre existente en un módulo de Python ; por ejemplo, nombre de una clase, función o variable. Al mecanismo de punto de entrada no le importa a qué se refiere el nombre, siempre que sea importable.
Como ejemplo, usemos (el nombre de) una función y un módulo de Python imaginario con un nombre completo 'myns.mypkg.mymodule':
def the_function():
"function whose name is 'the_function', in 'mymodule' module"
print "hello from the_function"
Los puntos de entrada se registran mediante una declaración de puntos de entrada en setup.py. Para registrar the_function bajo el punto de entrada llamado 'my_ep_func':
entry_points = {
'my_ep_group_id': [
'my_ep_func = myns.mypkg.mymodule:the_function'
]
},
Como muestra el ejemplo, los puntos de entrada están agrupados; existe una API correspondiente para buscar todos los puntos de entrada que pertenecen a un grupo (ejemplo a continuación).
Tras la instalación de un paquete (es decir, al ejecutar 'python setup.py install'), setuptools analiza la declaración anterior. Luego escribe la información analizada en un archivo especial. Después de eso, la API pkg_resources (parte de setuptools) se puede usar para buscar el punto de entrada y acceder a los objetos con los nombres asociados:
import pkg_resources
named_objects = {}
for ep in pkg_resources.iter_entry_points(group='my_ep_group_id'):
named_objects.update({ep.name: ep.load()})
Aquí, las herramientas de configuración leen la información del punto de entrada que se escribió en archivos especiales. Encontró el punto de entrada, importó el módulo (myns.mypkg.mymodule) y recuperó la función_definida allí, al llamar a pkg_resources.load().
Llamar a the_function entonces sería simple:
>>> named_objects['my_ep_func']()
hello from the_function
Por lo tanto, aunque quizás sea un poco difícil de entender al principio, el mecanismo del punto de entrada es bastante sencillo de usar. Proporciona una herramienta útil para el desarrollo de software Python conectable.