2009-04-21 14 views

Antwort

121

Ein "Einstiegspunkt" ist normalerweise eine Funktion (oder ein anderes aufrufbares funktionsähnliches Objekt), die ein Entwickler oder Benutzer Ihres Python-Pakets verwenden möchte, obwohl ein nicht aufrufbares Objekt als Einstiegspunkt bereitgestellt werden kann naja (wie richtig in den Kommentaren darauf hingewiesen!).

Die gängigste Art von Einstiegspunkt ist der Einstiegspunkt "console_script", der auf eine Funktion verweist, die Sie als Befehlszeilenprogramm für diejenigen bereitstellen möchten, die Ihr Paket installieren. Dies geht in den setup.py wie:

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

ich ein Paket haben habe ich nur „cursive.tools“ genannt entfalteten, und ich wollte es verfügbar einen „kursiven“ Befehl machen, dass jemand von der laufen konnte Kommandozeile, wie:

$ cursive --help 
usage: cursive ... 

Die Art und Weise, dies zu tun, ist eine Funktion definieren, wie vielleicht ein "cursive_command" -Funktion in Kursiv/tool/cmd.py, die wie folgt aussehen:

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

und so her; Es sollte davon ausgegangen werden, dass es von der Befehlszeile aus aufgerufen wurde, die vom Benutzer bereitgestellten Argumente analysiert und ... nun, was auch immer der Befehl ausführen soll.

Installieren Sie das docutils Paket für ein großartiges Beispiel für Entry-Punkt Anwendung: es so etwas wie ein halbes Dutzend nützliche Befehle für die Umwandlung von Python-Dokumentation in andere Formate installieren.

+3

Die aktuelle Datei 'setup.py' von docutils enthält überhaupt keine 'entry_points'. –

+2

Dies ist eine ausgezeichnete Antwort, da es die Leistungsfähigkeit mehrerer Projekte demonstriert, die einen einzigen Namen für den Namen der Eintragspunktgruppe "console_scripts" teilen. Vergleichen Sie diese Antwort mit der allgemeineren Antwort von Petri. Sie werden sehen, dass setuptools diesen pkg_resources-Mechanismus verwenden muss, um die console_scripts abzurufen und dann einen Shell-Wrapper um sie herum zu erstellen. Inspirierend? Benutze diese. Sie sind gut für mehr als nur console_scripts. –

16

Aus abstrakten Gesichtspunkten werden Einstiegspunkte verwendet, um eine systemweite Registrierung von Python-Callables zu erstellen, die bestimmte Schnittstellen implementieren. Es gibt APIs in pkg_resources, um zu sehen, welche Einstiegspunkte von einem gegebenen Paket beworben werden, sowie APIs, um zu bestimmen, welche Pakete einen bestimmten Einstiegspunkt bewerben.

Einstiegspunkte sind nützlich, damit ein Paket Plugins verwenden kann, die sich in einem anderen Paket befinden. Zum Beispiel verwendet Ian Bicking Projekt Eingangspunkte ausgiebig. In diesem Fall können Sie ein Paket schreiben, das seine WSGI-Anwendungsfactory mit dem Einstiegspunkt paste.app_factory ankündigt.

Eine andere Verwendung für Einstiegspunkte ist die Aufzählung aller Pakete auf dem System, die einige Plugin-Funktionalität bieten. Das TurboGears Web Framework verwendet den Einstiegspunkt python.templating.engines, um Templating-Bibliotheken zu suchen, die installiert und verfügbar sind.

152

EntryPoints bieten eine persistente, filesystem-basierte Objektnamenregistrierung und namensbasierten direkten Objektimport-Mechanismus (implementiert durch das setuptools Paket).

Sie verknüpfen Namen von Python-Objekten mit Freiform-IDs. So kann jeder andere Code, der die gleiche Python-Installation verwendet und den Identifikator kennt, auf ein Objekt mit dem zugehörigen Namen zugreifen, unabhängig davon, wo das Objekt definiert ist. Die verbundenen Namen können alle in einem Python-Modul vorhandenen Namen sein; zum Beispiel Name einer Klasse, Funktion oder Variable. Dem Einstiegspunktmechanismus ist es egal, worauf sich der Name bezieht, solange er importiert werden kann.

Als Beispiel verwenden wir (den Namen von) eine Funktion und ein imaginäres Python-Modul mit einem vollständig qualifizierten Namen 'myns.mypkg.mymodule ':

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

Einstiegspunkte werden über eine Einstiegspunktdeklaration in setup.py registriert. Um sich zu registrieren the_function unter Einstiegspunkt namens ‚my_ep_func‘:

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

Wie das Beispiel zeigt, Einstiegspunkte werden gruppiert; Es gibt eine entsprechende API, um alle Eingangspunkte, die zu einer Gruppe gehören, nachzuschlagen (Beispiel unten).

Bei einer Paketinstallation (dh "python setup.py install" wird ausgeführt) wird die obige Deklaration von setuptools analysiert. Es schreibt dann die geparste Information in eine spezielle Datei. Danach kann die pkg_resources API (Teil von Setuptool) verwendet werden, um den Einstiegspunkt zu suchen und auf das Objekt zugreifen (n) mit dem zugehörigen Namen (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()}) 

Hier Setuptools der Eintrittspunktinformation gelesen, dass wurde in speziellen Dateien geschrieben. Es hat den Einstiegspunkt gefunden, das Modul (myns.mypkg.mymodule) importiert und die dort definierte Funktion beim Aufruf von pkg_resources.load() abgerufen.

Vorausgesetzt, dass keine andere Zugangspunkt Anmeldungen für die gleiche Gruppe id dort waren, the_function Aufruf würde dann einfach sein:

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

Während also vielleicht ein bisschen schwierig, zunächst zu erfassen, ist der Einstiegspunkt Mechanismus tatsächlich ziemlich einfach zu bedienen. Es bietet ein nützliches Werkzeug für die Plug-in-fähige Python-Software-Entwicklung.

+4

Wo wird der Name 'my_ep_func' in diesem Prozess verwendet? Es wird anscheinend vom pkg_resources-Iterator für nichts verwendet. –

+2

@KamilKisiel: In dem hier zur Veranschaulichung verwendeten Beispiel wird der Name des Einstiegspunktes tatsächlich für nichts verwendet, noch muss er sein; ob der Name des Einstiegspunktes für irgendetwas verwendet wird, hängt von der Anwendung ab. Der Name ist einfach als _name_ -Attribut der Einstiegspunkt-Instanz verfügbar. – Petri

+1

Ich denke, dass das Verwerfen des ep.name und das Erstellen von named_objects eine Liste anstelle eines Wörterbuchs verwirrend war, also habe ich die Antwort bearbeitet. Dies, was die Antwort zeigt sowohl, wo der Name zu bekommen und ob es zu erwarten ist, die 'Funktion' oder 'my_ep_func'. Ansonsten musste der Leser an anderer Stelle zusätzliche Unterlagen finden. Dies ist eine ausgezeichnete Antwort und ist die kürzeste, klarste Erklärung von entry_points, die ich je gesehen habe! –