mac python setuptools

mac - python packages



Explicar los puntos de entrada de Python? (3)

He leído la documentación sobre los puntos de entrada de los huevos en Pylons y en las páginas Peak, y todavía no entiendo realmente. ¿Alguien podría explicarme?


Desde el punto de vista abstracto, los puntos de entrada se utilizan para crear un registro de callables de Python para todo el sistema que implementen ciertas interfaces. Hay API en pkg_resources para ver qué puntos de entrada publicitan un paquete determinado, así como las API para determinar qué paquetes anuncian un determinado punto de entrada.

Los puntos de entrada son útiles para permitir que un paquete use complementos que están en otro paquete. Por ejemplo, el proyecto Paste Ian Bicking usa puntos de entrada extensamente. En este caso, puede escribir un paquete que anuncie su fábrica de aplicaciones WSGI utilizando el punto de entrada paste.app_factory .

Otro uso para los puntos de entrada es enumerar todos los paquetes en el sistema que proporcionan alguna funcionalidad de complemento. El marco web de TurboGears utiliza el punto de entrada python.templating.engines para buscar bibliotecas de plantillas que estén instaladas y disponibles.


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 punto de entrada "console_script", que apunta a una función que desea que esté disponible como herramienta de línea de comandos para quien instale su paquete. Esto entra en tu setup.py 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 estuviera disponible un comando "cursivo" que alguien podría ejecutar desde la línea de comandos, como:

$ cursive --help usage: cursive ...

La forma de hacerlo es definir una función, como quizás una función "cursive_command" en cursive / tools / cmd.py que se ve así:

def cursive_command(): args = sys.argv[1:] if len(args) < 1: print "usage: ..."

Etcétera; debe suponer que ha sido llamado desde la línea de comando, analizar los argumentos que el usuario ha proporcionado, y ... bueno, hacer lo que el comando está diseñado para hacer.

Instale el paquete docutils para obtener 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.


EntryPoints proporcionan un EntryPoints persistente del nombre de objeto basado en el sistema de archivos y un mecanismo de importación de objeto directo basado en el nombre (implementado por el paquete setuptools ).

Asocian nombres de objetos Python con identificadores de forma libre. Por lo tanto, cualquier otro código que use la misma instalación de Python y que 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, el 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 pitón imaginario con un nombre completamente calificado ''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 a través de 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; hay API correspondiente para buscar todos los puntos de entrada que pertenecen a un grupo (ejemplo a continuación).

En una instalación de paquete (es decir, ejecutando ''python setup.py install''), la declaración anterior es analizada por setuptools. 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 al objeto (s) con el nombre asociado (s):

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 ().

Suponiendo que no hubiera otros registros de punto de entrada para el mismo ID de grupo, llamar a the_function sería simple:

>>> named_objects[''my_ep_func'']() hello from the_function

Por lo tanto, aunque quizás sea un poco difícil de comprender al principio, el mecanismo del punto de entrada es bastante simple de usar. Proporciona una herramienta útil para el desarrollo de software de Python conectable.