Spiegare i punti di ingresso di Python?


181

Ho letto la documentazione sui punti di entrata delle uova in Piloni e nelle pagine Peak, e ancora non capisco davvero. Qualcuno potrebbe spiegarmeli?

Risposte:


168

Un "punto di ingresso" è in genere una funzione (o un altro oggetto simile a una funzione richiamabile) che uno sviluppatore o un utente del pacchetto Python potrebbe voler utilizzare, sebbene un oggetto non richiamabile possa essere fornito anche come punto di ingresso (correttamente sottolineato nei commenti!).

Il tipo più popolare di punto di ingresso è il punto di ingresso console_scripts , che punta a una funzione che si desidera rendere disponibile come strumento da riga di comando a chiunque installi il proprio pacchetto. Questo va nel tuo setup.py come:

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

Ho un pacchetto che ho appena distribuito chiamato "cursive.tools" e volevo che rendesse disponibile un comando "corsivo" che qualcuno potesse eseguire dalla riga di comando, come:

$ cursive --help
usage: cursive ...

Il modo per farlo è definire una funzione, come forse una funzione "cursive_command" in cursive / tools / cmd.py che assomiglia a:

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

e così via; dovrebbe presumere che sia stato chiamato dalla riga di comando, analizzare gli argomenti forniti dall'utente e ... beh, fare qualunque cosa il comando sia progettato per fare.

Installa il pacchetto docutils per un ottimo esempio dell'uso del punto di ingresso: installerà qualcosa come una mezza dozzina di comandi utili per convertire la documentazione di Python in altri formati.


3
l'attuale docutils ' setup.pynon contiene entry_pointsaffatto.
matt wilkie,

2
Questa è una risposta eccellente in quanto dimostra la potenza di più progetti che condividono un singolo nome di gruppo entry_point, che è "console_scripts". Confronta questa risposta con la risposta più generale di Petri. Vedrai che setuptools deve utilizzare questo meccanismo pkg_resources per ottenere console_scripts e quindi creare un involucro della shell attorno ad essi. Di ispirazione? Usa questi. Sono utili solo per console_scripts.
Bruno Bronosky,

188

EntryPoints fornisce un persistente sistema di registrazione dei nomi di oggetti basato su filesystem e di importazione diretta di oggetti basato su nomi (implementato dal pacchetto setuptools ).

Associano i nomi degli oggetti Python con identificatori in formato libero. Pertanto, qualsiasi altro codice che utilizza la stessa installazione di Python e che conosce l'identificatore può accedere a un oggetto con il nome associato, indipendentemente da dove sia definito l'oggetto. I nomi associati possono essere qualsiasi nome esistente in un modulo Python ; ad esempio il nome di una classe, funzione o variabile. Il meccanismo del punto di ingresso non importa a cosa si riferisce il nome, purché sia ​​improprio.

Ad esempio, usiamo (il nome di) una funzione e un immaginario modulo Python con un nome completo "myns.mypkg.mymodule":

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

I punti di ingresso sono registrati tramite una dichiarazione dei punti di ingresso in setup.py. Per registrare la funzione_ sotto entrypoint chiamato 'my_ep_func':

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

Come mostra l'esempio, i punti di ingresso sono raggruppati; c'è un'API corrispondente per cercare tutti i punti di ingresso appartenenti a un gruppo (esempio di seguito).

Al momento dell'installazione di un pacchetto (es. In esecuzione 'python setup.py install'), la dichiarazione di cui sopra viene analizzata da setuptools. Quindi scrive le informazioni analizzate in un file speciale. Successivamente, l' API pkg_resources (parte di setuptools) può essere utilizzata per cercare il punto di ingresso e accedere agli oggetti con i nomi associati:

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

Qui, setuptools legge le informazioni sul punto di ingresso scritte in file speciali. Ha trovato il punto di ingresso, ha importato il modulo (myns.mypkg.mymodule) e ha recuperato la funzione definita lì, su chiamata a pkg_resources.load ().

Supponendo che non vi fossero altre registrazioni dei punti di ingresso per lo stesso ID di gruppo, chiamare la funzione_ sarebbe quindi semplice:

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

Quindi, sebbene all'inizio sia un po 'difficile da comprendere, il meccanismo del punto di ingresso è in realtà abbastanza semplice da usare. Fornisce uno strumento utile per lo sviluppo del software Python collegabile.


4
Dove viene utilizzato il nome "my_ep_func" in tutto questo processo? Non sembra essere utilizzato per nulla dall'iteratore pkg_resources.
Kamil Kisiel,

2
@KamilKisiel: nell'esempio qui usato per l'illustrazione, il nome del punto di ingresso non viene effettivamente utilizzato per nulla, né è necessario; se il nome del punto di ingresso viene utilizzato per qualsiasi cosa dipende dall'applicazione. Il nome è disponibile semplicemente come attributo name dell'istanza del punto di ingresso.
Petri,

3
Penso che scartare ep.name e rendere named_objects un elenco anziché un dizionario fosse confuso, quindi ho modificato la risposta. Questo è ciò che la risposta mostra sia dove ottenere il nome sia se aspettarsi che sia "the_function" o "my_ep_func". Altrimenti il ​​lettore doveva trovare altra documentazione altrove. Questa è una risposta ECCELLENTE ed è la spiegazione più breve e chiara dei entry_points che io abbia mai visto!
Bruno Bronosky,

3
Ho creato un progetto su Github che dimostra questo concetto. github.com/RichardBronosky/entrypoint_demo
Bruno Bronosky

1
Questa è una spiegazione molto chiara dei punti di ingresso, che è per la spiegazione dettagliata. Il EntryPointscollegamento è stantio, sebbene la spiegazione sia molto chiara.
Rahul Nair,

18

Da un punto di vista astratto, i punti di ingresso vengono utilizzati per creare un registro di sistema di callable Python che implementano determinate interfacce. Ci sono API in pkg_resources per vedere quali punti di ingresso sono pubblicizzati da un determinato pacchetto e API per determinare quali pacchetti pubblicizzano un determinato punto di ingresso.

I punti di ingresso sono utili per consentire a un pacchetto di utilizzare plug-in che si trovano in un altro pacchetto. Ad esempio, il progetto Paste di Ian Bicking utilizza ampiamente i punti di ingresso. In questo caso, è possibile scrivere un pacchetto che pubblicizza la sua factory di applicazione WSGI usando il punto di ingresso paste.app_factory.

Un altro uso dei punti di ingresso è l'enumerazione di tutti i pacchetti sul sistema che forniscono alcune funzionalità di plugin. Il framework Web TurboGears utilizza il python.templating.enginespunto di ingresso per cercare le librerie di modelli che sono installate e disponibili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.