Python-Einstiegspunkte

Viele Leute denken, dass Einstiegspunkte Anweisungen in setup.py sind , die das Paket zur Ausführung über die Befehlszeile bereitstellen . Dies ist im Allgemeinen der Fall, aber die Funktionen von Einstiegspunkten sind nicht darauf beschränkt.

Im Folgenden werde ich zeigen, wie es möglich ist, ein Plug-In-System für ein Paket zu implementieren, damit andere Personen mit ihm interagieren oder beispielsweise seine Funktionalität dynamisch erweitern können.



Achtung : spezifischer Humor im Folgenden.

LLC "Schlange"


Herzlichen Glückwunsch! Sie wurden gerade zum Leiter von Snake LLC ernannt. Dies ist eine sehr verantwortungsbewusste Position. Sie können sich dem Schmutz nicht stellen. Daher müssen Sie die Entwicklungsabteilung so schnell wie möglich anweisen, mit der Erstellung eines Prototyps des Produkts zu beginnen. Und so beginnen die besten Köpfe des Unternehmens mit der Arbeit an snek.py:

ascii_snek = """\ --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` """ def main(): print(ascii_snek) if __name__ == '__main__': main() 

Wenig später demonstrieren Sie auf einer Aktionärsversammlung stolz die ersten Ergebnisse!

 $ python snek.py --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` 

Snake as a Service


Leider hat der Durchschnittsverbraucher Python noch nicht beherrscht und möchte das Programm von der Konsole aus ausführen, ohne sich Gedanken über den Interpreter oder den Speicherort von snek.py zu machen. Nun, unsere besten Spezialisten sind die Besten, die es geschafft haben, das Skript so zu packen, dass es während der Installation automatisch einen Konsolenbefehl erstellt.

Um ein weiterverteilbares Paket zu erstellen, benötigen wir die Datei setup.py , die Informationen zu Abhängigkeiten, Lizenzen usw. enthält. Außerdem können Sie darin Einstiegspunkte angeben:

 from setuptools import setup setup( name='snek', entry_points={ 'console_scripts': [ 'snek = snek:main', ], } ) 

console_scripts ist , wie die Experten erklärten, ein besonderer Einstiegspunkt. setuptools liest seine Elemente als "<Konsolenskript> = <Pfad zum Python-Objekt>" und erstellt bei der Installation des Pakets für jedes Element ein Konsolendienstprogramm.

Lassen Sie uns jetzt das Skript von den Quellen installieren:

 $ python setup.py develop running develop running egg_info writing snek.egg-info\PKG-INFO writing dependency_links to snek.egg-info\dependency_links.txt writing entry points to snek.egg-info\entry_points.txt writing top-level names to snek.egg-info\top_level.txt reading manifest file 'snek.egg-info\SOURCES.txt' writing manifest file 'snek.egg-info\SOURCES.txt' running build_ext Creating c:\program files (x86)\py36-32\lib\site-packages\snek.egg-link (link to .) snek 0.0.0 is already the active version in easy-install.pth Installing snek-script.py script to C:\Program Files (x86)\Py36-32\Scripts Installing snek.exe script to C:\Program Files (x86)\Py36-32\Scripts Installing snek.exe.manifest script to C:\Program Files (x86)\Py36-32\Scripts Installed c:\users\rachum\notebooks Processing dependencies for snek==0.0.0 Finished processing dependencies for snek==0.0.0 

Auf der Konferenz zu den Ergebnissen des Jahres sprechen Sie über die neuesten Entwicklungen:

 $ snek --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` 

Eine Schlange in jedem Haus


Die Schlange erobert die Welt. Das Unternehmen hat einen Börsengang durchgeführt und einen Rekordwert von 60 Milliarden US-Dollar erzielt. Hipster fordern eine neue, stilvolle, modische und jugendliche Schlange. Und wenn Nachfrage besteht, gibt es ein Angebot:

 """ ASCII . : snek [--type=TYPE] """ import docopt normal_snek = """\ --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` """ fancy_snek = """\ _,..,,,_ '``````^~"-,_`"-,_ .-~c~-. `~:. ^-. `~~~-.c ; `:. `-, _.-~~^^~:. `. ; _,--~~~~-._ `:. ~. .~ `. .` ;' .:` `: `:. ` _.:-,. `. .' .: :' _.-~^~-. `. `..' .: `. ' : .' _:' .-' `. :. .: .'`. : ; : `-' .:' `. `^~~^` .:. `. ; ; `-.__,-~ ~-. ,' ': '.__.` :' ~--..--' ':. .:' ':..___.:' """ def get_sneks(): return { 'normal': normal_snek, 'fancy': fancy_snek, } def main(): args = docopt.docopt(__doc__) snek_type = args['--type'] or 'normal' print(get_sneks()[snek_type]) if __name__ == '__main__': main() 

Hipster sind begeistert:

 $ snek --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` $ snek --type fancy _,..,,,_ '``````^~"-,_`"-,_ .-~c~-. `~:. ^-. `~~~-.c ; `:. `-, _.-~~^^~:. `. ; _,--~~~~-._ `:. ~. .~ `. .` ;' .:` `: `:. ` _.:-,. `. .' .: :' _.-~^~-. `. `..' .: `. ' : .' _:' .-' `. :. .: .'`. : ; : `-' .:' `. `^~~^` .:. `. ; ; `-.__,-~ ~-. ,' ': '.__.` :' ~--..--' ':. .:' ':..___.:' 

Transnationale Schlange


Millionen von Menschen können sich ihren Tag ohne eine Schlange nicht vorstellen. Selbst nach der Übernahme von Google reichen die Ressourcen von Zmeika nicht aus, um die Bedürfnisse von Nutzern auf der ganzen Welt zu befriedigen. Es scheint an der Zeit zu sein, Menschen die Möglichkeit zu geben, ihre eigenen Schlangen basierend auf unserer Infrastruktur zu erschaffen.

 """ ASCII . : snek [--type=TYPE] """ import docopt import pkg_resources normal_snek = """\ --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` """ fancy_snek = """\ _,..,,,_ '``````^~"-,_`"-,_ .-~c~-. `~:. ^-. `~~~-.c ; `:. `-, _.-~~^^~:. `. ; _,--~~~~-._ `:. ~. .~ `. .` ;' .:` `: `:. ` _.:-,. `. .' .: :' _.-~^~-. `. `..' .: `. ' : .' _:' .-' `. :. .: .'`. : ; : `-' .:' `. `^~~^` .:. `. ; ; `-.__,-~ ~-. ,' ': '.__.` :' ~--..--' ':. .:' ':..___.:' """ def get_sneks(): sneks = { 'normal': normal_snek, 'fancy': fancy_snek, } for entry_point in pkg_resources.iter_entry_points('snek_types'): sneks[entry_point.name] = entry_point.load() return sneks def main(): args = docopt.docopt(__doc__) snek_type = args['--type'] or 'normal' print(get_sneks()[snek_type]) if __name__ == '__main__': main() 

Jetzt sucht snek bei jedem Start nach anderen im System registrierten Schlangen mithilfe des Einstiegspunkts snek_types . Jede solche Schlange wird unter dem Namen ihres Typs registriert, wodurch Sie die gewünschte Schlange in Abhängigkeit von den Parametern der Konsole auswählen können.

Das Wichtigste passiert in get_sneks . Durch Aufrufen von pkg_resources.iter_entry_points ('snek_types') können Sie alle unter dem Namen "snek_types" registrierten Einstiegspunkte überall durchgehen . Somit kann jedes Paket eines Drittanbieters in seiner setup.py einen Einstiegspunkt "snek_types" erstellen , der mit unserem Skript geladen wird.

Wir sprachen mit unseren Kollegen von Snake Solutions LLC über snek_types , und sie begannen sofort, die Schlange ihrer Träume zu erschaffen. So entstand das Paket cute_snek.py :

 cute_snek = r""" /^\/^\ _|__| O| \/ /~ \_/ \ \____|__________/ \ \_______ \ `\ \ \ | | \ / / \ / / \ / / \ \ / / \ \ / / _----_ \ \ / / _-~ ~-_ | | ( ( _-~ _--_ ~-_ _/ | \ ~-____-~ _-~ ~-_ ~-_-~ / ~-_ _-~ ~-_ _-~ ~--______-~ ~-___-~ """ 

Und so haben sie ihre setup.py implementiert, damit unser Snek ihre Schlange laden kann:

 from setuptools import setup setup( name='cute_snek', entry_points={ 'snek_types': [ 'cute = cute_snek:cute_snek', ], } ) 

Sie haben die Variable cute_snek im Modul cute_snek unter dem Namen cute registriert. Als nächstes installieren sie die Pakete snek und cute_snek :

 $ cd cute_snek && python setup.py develop running develop running egg_info writing cute_snek.egg-info\PKG-INFO writing dependency_links to cute_snek.egg-info\dependency_links.txt writing entry points to cute_snek.egg-info\entry_points.txt writing top-level names to cute_snek.egg-info\top_level.txt reading manifest file 'cute_snek.egg-info\SOURCES.txt' writing manifest file 'cute_snek.egg-info\SOURCES.txt' running build_ext Creating c:\program files (x86)\py36-32\lib\site-packages\cute-snek.egg-link (link to .) cute-snek 0.0.0 is already the active version in easy-install.pth Installed c:\users\rachum\cute_snek Processing dependencies for cute-snek==0.0.0 Finished processing dependencies for cute-snek==0.0.0 

Wenn sie nun snek ausführen , können sie ihre Schlange aus dem cute_snek- Paket holen , indem sie sie dynamisch am Einstiegspunkt laden:

 $ snek --type cute /^\/^\ _|__| O| \/ /~ \_/ \ \____|__________/ \ \_______ \ `\ \ \ | | \ / / \ / / \ / / \ \ / / \ \ / / _----_ \ \ / / _-~ ~-_ | | ( ( _-~ _--_ ~-_ _/ | \ ~-____-~ _-~ ~-_ ~-_-~ / ~-_ _-~ ~-_ _-~ ~--______-~ ~-___-~ 

Schlange 2.0


Während die gesamte Aufmerksamkeit des Top-Managements auf die Demontage der Steueraufsichtsbehörde und des Antimonopol-Dienstes gerichtet ist, kann die Entwicklungsabteilung endlich etwas Zeit finden, um den Code umzugestalten.

Der Chef-Systemarchitekt erkannte, dass, wenn Schlangen von Drittanbietern als Plug-Ins heruntergeladen werden können, auch integrierte Schlangen heruntergeladen werden können.

Wir entfernen die spezielle Verarbeitung der eingebauten Schlangen:

 --- a/snek.py +++ b/snek.py @@ -31,10 +31,7 @@ fancy_snek = """\ """ def get_sneks(): - sneks = { - 'normal': normal_snek, - 'fancy': fancy_snek, - } + sneks = {} for entry_point in pkg_resources.iter_entry_points('snek_types'): sneks[entry_point.name] = entry_point.load() return sneks 

Und im Gegenzug werden wir universelle Einstiegspunkte für sie registrieren:

 --- a/setup.py +++ b/setup.py @@ -6,5 +6,9 @@ setup( 'console_scripts': [ 'snek = snek:main', ], + 'snek_types': [ + 'normal = snek:normal_snek', + 'fancy = snek:fancy_snek', + ], }, ) 

Installiere die modifizierte Schlange neu:

 $ python setup.py develop running develop running egg_info writing snek.egg-info\PKG-INFO writing dependency_links to snek.egg-info\dependency_links.txt writing entry points to snek.egg-info\entry_points.txt writing top-level names to snek.egg-info\top_level.txt reading manifest file 'snek.egg-info\SOURCES.txt' writing manifest file 'snek.egg-info\SOURCES.txt' running build_ext Creating c:\program files (x86)\py36-32\lib\site-packages\snek.egg-link (link to .) snek 0.0.0 is already the active version in easy-install.pth Installing snek-script.py script to C:\Program Files (x86)\Py36-32\Scripts Installing snek.exe script to C:\Program Files (x86)\Py36-32\Scripts Installing snek.exe.manifest script to C:\Program Files (x86)\Py36-32\Scripts Installed c:\users\rachum\notebooks Processing dependencies for snek==0.0.0 Finished processing dependencies for snek==0.0.0 

Überprüfen Sie das Ergebnis:

 $ snek --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` $ snek --type fancy _,..,,,_ '``````^~"-,_`"-,_ .-~c~-. `~:. ^-. `~~~-.c ; `:. `-, _.-~~^^~:. `. ; _,--~~~~-._ `:. ~. .~ `. .` ;' .:` `: `:. ` _.:-,. `. .' .: :' _.-~^~-. `. `..' .: `. ' : .' _:' .-' `. :. .: .'`. : ; : `-' .:' `. `^~~^` .:. `. ; ; `-.__,-~ ~-. ,' ': '.__.` :' ~--..--' ':. .:' ':..___.:' $ snek --type cute /^\/^\ _|__| O| \/ /~ \_/ \ \____|__________/ \ \_______ \ `\ \ \ | | \ / / \ / / \ / / \ \ / / \ \ / / _----_ \ \ / / _-~ ~-_ | | ( ( _-~ _--_ ~-_ _/ | \ ~-____-~ _-~ ~-_ ~-_-~ / ~-_ _-~ ~-_ _-~ ~--______-~ ~-___-~ 



Das ist alles Jetzt können Sie Einstiegspunkte in Python verwenden!

Source: https://habr.com/ru/post/de479570/


All Articles