Ho letto la documentazione sui punti di entrata delle uova in Piloni e nelle pagine Peak, e ancora non capisco davvero. Qualcuno potrebbe spiegarmeli?
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:
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.
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.
EntryPoints
collegamento è stantio, sebbene la spiegazione sia molto chiara.
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.engines
punto di ingresso per cercare le librerie di modelli che sono installate e disponibili.
setup.py
non contieneentry_points
affatto.