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:
Et en retour, nous leur enregistrerons des points d'entrée universels:
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!