Points d'entrée Python

Beaucoup de gens pensent que les points d'entrée sont des instructions dans setup.py qui rendent le package disponible pour s'exécuter à partir de la ligne de commande. C'est généralement vrai, mais les capacités des points d'entrée ne se limitent pas à cela.

Ci-dessous, je montrerai comment vous pouvez implémenter un systÚme de plug-in pour un package afin que d'autres personnes puissent interagir avec lui ou, par exemple, étendre ses fonctionnalités de maniÚre dynamique.



Attention : humour spécifique ci-aprÚs.

LLC "Serpent"


FĂ©licitations! Vous venez d'ĂȘtre nommĂ© Ă  la tĂȘte de Snake LLC. Il s'agit d'un poste trĂšs responsable, vous ne pouvez pas faire face Ă  la saletĂ©, ce qui signifie que vous devez informer le service de dĂ©veloppement dĂšs que possible pour commencer Ă  crĂ©er un prototype du produit. Et donc, les meilleurs esprits de l'entreprise commencent Ă  travailler sur snek.py:

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

Un peu plus tard, lors d'une assemblée des actionnaires, vous démontrez fiÚrement les premiers résultats!

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

Serpent en tant que service


Malheureusement, le consommateur moyen n'a pas encore maßtrisé Python et souhaite exécuter le programme à partir de la console sans penser à l'interpréteur ou à l'emplacement snek.py. Eh bien, nos meilleurs spécialistes sont les meilleurs qui ont pu emballer le script pour qu'il crée automatiquement une commande de console lors de l'installation.

Pour créer un package redistribuable, nous avons besoin du fichier setup.py , qui contient des informations sur les dépendances, les licences, etc. De plus, vous pouvez y spécifier des points d'entrée:

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

console_scripts , comme l'ont expliqué les experts, est un point d'entrée spécial. setuptools lit ses éléments comme "<script de console> = <chemin vers l'objet Python>" , créant un utilitaire de console pour chaque élément lors de l'installation du package.

Pour l'instant, installons le script Ă  partir des sources:

 $ 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 

Lors de la conférence consacrée aux résultats de l'année, vous parlez, démontrant les derniers développements:

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

Un serpent dans chaque maison


Le serpent conquiert le monde. L'entreprise a procédé à une introduction en bourse et a été évaluée à un montant record de 60 milliards de dollars. Les hipsters exigent un nouveau serpent élégant, à la mode et jeune. Et s'il y a une demande, il y aura une offre:

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

Les hipsters sont ravis:

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

Serpent transnational


Des millions de personnes ne peuvent pas imaginer leur journĂ©e sans serpent. MĂȘme aprĂšs le rachat de Google, les ressources de Zmeika ne suffisent pas Ă  satisfaire les besoins des utilisateurs du monde entier. Il semble que le moment soit venu de donner aux gens la possibilitĂ© de crĂ©er leurs propres serpents en fonction de notre infrastructure.

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

Désormais, chaque fois que snek est lancé, il recherche d'autres serpents enregistrés dans le systÚme à l'aide du point d' entrée snek_types . Chacun de ces serpents est enregistré sous le nom de son type, ce qui vous permet de sélectionner le serpent souhaité en fonction des paramÚtres de la console.

Toutes les choses les plus importantes se produisent dans get_sneks . L'appel Ă  pkg_resources.iter_entry_points ('snek_types') vous permet de parcourir tous les points d'entrĂ©e enregistrĂ©s sous le nom "snek_types" n'importe oĂč. Ainsi, tout paquet tiers pourra crĂ©er un point d'entrĂ©e «snek_types» dans son setup.py pour ĂȘtre chargĂ© avec notre script.

Nous avons parlĂ© de snek_types Ă  nos collĂšgues de Snake Solutions LLC, et ils ont immĂ©diatement commencĂ© Ă  crĂ©er le serpent de leurs rĂȘves. C'est ainsi qu'est nĂ© leur package cute_snek.py :

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

Et voici comment ils ont implémenté leur setup.py pour que notre snek puisse charger leur serpent:

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

Ils ont enregistré la variable cute_snek dans le module cute_snek sous le nom cute . Ensuite, ils installent les packages snek et 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 

Maintenant, en exécutant snek , ils peuvent retirer leur serpent du paquet cute_snek en le chargeant dynamiquement au point d'entrée:

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

Snake 2.0


Alors que toute l'attention de la haute direction va au démontage avec l'inspection fiscale et le service antimonopole, la direction du développement peut enfin trouver un peu de temps pour refaçonner le code.

L'architecte systĂšme en chef a rĂ©alisĂ© que si des serpents tiers peuvent ĂȘtre tĂ©lĂ©chargĂ©s sous forme de plug-ins, les serpents intĂ©grĂ©s peuvent Ă©galement ĂȘtre tĂ©lĂ©chargĂ©s.

Nous supprimons le traitement spécial des serpents intégrés:

 --- 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 

Et en retour, nous leur enregistrerons des points d'entrée universels:

 --- 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', + ], }, ) 

Réinstallez le serpent modifié:

 $ 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 

Vérifiez le résultat:

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



C’est tout. Vous savez maintenant comment utiliser les points d'entrĂ©e en Python!

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


All Articles