web-dev-qa-db-fra.com

Expliquez Python?

J'ai lu la documentation sur les points d'entrée des œufs dans les pylônes et sur les pages Peak et je ne comprends toujours pas. Quelqu'un pourrait-il m'expliquer?

164
Brad Wright

Un "point d'entrée" est généralement une fonction (ou tout autre objet similaire à une fonction appelable) qu'un développeur ou un utilisateur de votre paquet Python peut vouloir utiliser, bien qu'un objet non appelable puisse être fourni comme un point d’entrée également (comme indiqué avec justesse dans les commentaires!).

Le type de point d'entrée le plus populaire est le point d'entrée "console_script", qui pointe vers une fonction que vous souhaitez rendre disponible en tant qu'outil en ligne de commande pour qui installe votre package. Cela va dans votre setup.py comme:

entry_points={
    'console_scripts': [
        'cursive = cursive.tools.cmd:cursive_command',
    ],
},

J'ai un paquet que je viens de déployer et qui s'appelle "cursive.tools" et je voulais qu'il rende disponible une commande "cursive" pouvant être exécutée à partir de la ligne de commande, telle que:

$ cursive --help
usage: cursive ...

Pour ce faire, définissez une fonction, comme une fonction "cursive_command" dans cursive/tools/cmd.py, qui ressemble à ceci:

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

et ainsi de suite; il devrait supposer qu'il a été appelé à partir de la ligne de commande, analyser les arguments fournis par l'utilisateur et ... eh bien, faites ce que la commande est conçue pour faire.

Installez le paquet docutils pour un bon exemple d’utilisation du point d’entrée: il installera quelque chose comme une demi-douzaine de commandes utiles pour la conversion de la documentation Python dans d’autres formats.

150
Brandon Rhodes

EntryPoints fournit un mécanisme persistant d'enregistrement de nom d'objet basé sur un système de fichiers et un mécanisme d'importation directe d'objet basé sur un nom (implémenté par le paquet setuptools ).

Ils associent les noms des objets Python à des identifiants de forme libre. Ainsi, tout autre code utilisant la même installation Python et connaissant l'identifiant peut accéder à un objet avec le code associé. name, peu importe où l’objet est défini. Les noms associés peuvent être n’importe quel nom existant dans un Python module ; Par exemple, le nom d'une classe, d'une fonction ou d'une variable. Le mécanisme de point d'entrée ne tient pas compte de ce à quoi le nom fait référence, tant qu'il est importable.

Par exemple, utilisons (le nom de) une fonction et un module imaginaire python avec un nom complet 'myns.mypkg.mymodule':

def the_function():
   "function whose name is 'the_function', in 'mymodule' module"
   print "hello from the_function"

Les points d'entrée sont enregistrés via une déclaration des points d'entrée dans setup.py. Pour enregistrer la fonction sous le point d'entrée appelé 'my_ep_func':

    entry_points = {
        'my_ep_group_id': [
            'my_ep_func = myns.mypkg.mymodule:the_function'
        ]
    },

Comme le montre l'exemple, les points d'entrée sont regroupés. L'API correspondante permet de rechercher tous les points d'entrée appartenant à un groupe (exemple ci-dessous).

Lors de l'installation d'un paquet (c'est-à-dire l'exécution de 'python setup.py install'), la déclaration ci-dessus est analysée par setuptools. Il écrit ensuite les informations analysées dans un fichier spécial. Après cela, vous pouvez utiliser pkg_resources API (composant de setuptools) pour rechercher le point d'entrée et accéder aux objets avec le nom associé:

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

Ici, setuptools lit les informations de point d’entrée écrites dans des fichiers spéciaux. Il a trouvé le point d'entrée, importé le module (myns.mypkg.mymodule) et récupéré la fonction_ définie ici, lors de l'appel de pkg_resources.load ().

En supposant qu'il n'y ait pas d'autres enregistrements de points d'entrée pour le même identifiant de groupe, appeler la_fonction serait alors simple:

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

Ainsi, bien qu’il soit peut-être un peu difficile à comprendre au début, le mécanisme du point d’entrée est en réalité assez simple à utiliser. Il fournit un outil utile pour le développement de logiciels enfichables Python.

178
Petri

D'un point de vue abstrait, les points d'entrée sont utilisés pour créer un registre à l'échelle du système des callables Python qui implémentent certaines interfaces. Il existe des API dans pkg_resources pour voir quels points d'entrée sont publiés par un paquet donné. ainsi que des API pour déterminer les packages qui annoncent un certain point d'entrée.

Les points d’entrée sont utiles pour permettre à un paquet d’utiliser des plugins se trouvant dans un autre paquet. Par exemple, le projet Paste de Ian Bicking utilise beaucoup de points d'entrée. Dans ce cas, vous pouvez écrire un package qui annonce sa fabrique d'applications WSGI à l'aide du point d'entrée paste.app_factory.

Une autre utilisation des points d’entrée consiste à énumérer tous les packages du système fournissant certaines fonctionnalités de plug-in. Le framework web TurboGears utilise le python.templating.engines point d’entrée pour rechercher les bibliothèques de modèles installées et disponibles.

16
Rick Copeland