webentwicklung-frage-antwort-db.com.de

Erklären Sie Python Einstiegspunkte?

Ich habe die Dokumentation zu den Einstiegspunkten für Eier in Pylons und auf den Peak-Seiten gelesen und verstehe sie immer noch nicht richtig. Könnte jemand sie mir erklären?

164
Brad Wright

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

Die beliebteste Art von Einstiegspunkt ist der Einstiegspunkt "console_script", der auf eine Funktion verweist, die als Befehlszeilentool für jeden verfügbar sein soll, der Ihr Paket installiert. Dies geht in Ihre setup.py wie folgt:

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

Ich habe ein Paket mit dem Namen "cursive.tools", das ich gerade bereitgestellt habe, und wollte, dass es einen "cursive" -Befehl zur Verfügung stellt, den jemand über die Befehlszeile ausführen kann, z.

$ cursive --help
usage: cursive ...

Der Weg, dies zu tun, besteht darin, eine Funktion zu definieren, wie zum Beispiel eine "cursive_command" -Funktion in cursive/tools/cmd.py, die wie folgt aussieht:

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

und so weiter; Es sollte davon ausgegangen werden, dass der Befehl über die Befehlszeile aufgerufen wurde, die vom Benutzer angegebenen Argumente analysiert und ... alles getan werden, wofür der Befehl entwickelt wurde.

Installieren Sie das docutils -Paket, um ein hervorragendes Beispiel für die Verwendung von Einstiegspunkten zu erhalten: Es installiert etwa ein halbes Dutzend nützlicher Befehle zum Konvertieren der Python Dokumentation in andere Formate.

150
Brandon Rhodes

EntryPoints Stellt eine dauerhafte, dateisystembasierte Objektnamenregistrierung und einen namensbasierten direkten Objektimportmechanismus bereit (implementiert durch das Paket setuptools ).

Sie verknüpfen Namen von Python Objekten mit Freiform-IDs. Jeder andere Code, der dieselbe Python Installation verwendet und die ID kennt, kann auf ein Objekt mit dem verknüpften zugreifen name, egal wo das Objekt definiert ist. Die zugeordneten Namen können beliebige Namen sein, die in einem Python module ; Zum Beispiel Name einer Klasse, Funktion oder Variablen. Der Einstiegspunktmechanismus kümmert sich nicht darum, worauf sich der Name bezieht, solange er importierbar ist.

Als Beispiel verwenden wir (den Namen) einer Funktion und ein imaginäres python Modul mit dem vollqualifizierten 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 Einstiegspunkterklärung in setup.py registriert. So registrieren Sie die Funktion unter dem Entypoint "my_ep_func":

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

Wie das Beispiel zeigt, sind die Einstiegspunkte gruppiert. Es gibt eine entsprechende API, um nach allen Eintrittspunkten zu suchen, die zu einer Gruppe gehören (Beispiel unten).

Bei einer Paketinstallation (dh beim Ausführen von 'python setup.py install') wird die obige Deklaration von setuptools analysiert. Anschließend werden die analysierten Informationen in eine spezielle Datei geschrieben. Danach kann die pkg_resources API (Teil von setuptools) verwendet werden, um den Einstiegspunkt zu suchen und auf die Objekte mit den zugehörigen Namen zuzugreifen:

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 lesen setuptools die Einstiegspunktinformationen, die in speziellen Dateien geschrieben wurden. Beim Aufruf von pkg_resources.load () wurde der Einstiegspunkt gefunden, das Modul (myns.mypkg.mymodule) importiert und die dort definierte Funktion abgerufen.

Unter der Annahme, dass es keine anderen Einstiegspunktregistrierungen für dieselbe Gruppen-ID gibt, wäre der Aufruf der Funktion einfach:

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

So ist der Einstiegspunktmechanismus zwar auf den ersten Blick vielleicht etwas schwer zu fassen, tatsächlich aber recht einfach zu bedienen. Es bietet ein nützliches Werkzeug für die steckbare Python Softwareentwicklung.

178
Petri

Aus abstrakter Sicht werden Einstiegspunkte verwendet, um eine systemweite Registrierung von Python Callables, die bestimmte Schnittstellen implementieren. Es gibt APIs in pkg_resources, um zu sehen, welche Einstiegspunkte von einem bestimmten Paket angekündigt werden sowie APIs, um zu bestimmen, welche Pakete einen bestimmten Einstiegspunkt ankündigen.

Einstiegspunkte sind nützlich, um zuzulassen, dass ein Paket Plugins verwendet, die sich in einem anderen Paket befinden. Zum Beispiel verwendet Ian Bickings Einfügen Projekt die Einstiegspunkte in großem Umfang. In diesem Fall können Sie ein Paket schreiben, das die WSGI-Anwendungsfactory mit dem Einstiegspunkt paste.app_factory Ankündigt.

Eine andere Verwendung für Einstiegspunkte besteht darin, alle Pakete auf dem System aufzulisten, die einige Plug-in-Funktionen bieten. Das TurboGears Web-Framework verwendet den python.templating.engines Einstiegspunkt, um nach Vorlagenbibliotheken zu suchen, die installiert und verfügbar sind.

16
Rick Copeland