कई लोग सोचते हैं कि एंट्री पॉइंट
setup.py में निर्देश हैं जो कमांड लाइन से चलाने के लिए पैकेज उपलब्ध
कराते हैं । यह आम तौर पर सच है, लेकिन प्रवेश बिंदुओं की क्षमताएं इस तक सीमित नहीं हैं।
नीचे मैं दिखाऊंगा कि आप एक पैकेज के लिए प्लग-इन सिस्टम कैसे लागू कर सकते हैं ताकि अन्य लोग इसके साथ बातचीत कर सकें या, उदाहरण के लिए, इसकी कार्यक्षमता का गतिशील रूप से विस्तार करें।
सावधानी : बाद में विशिष्ट हास्य।एलएलसी "स्नेक"
बधाई! आपको अभी-अभी स्नेक एलएलसी का प्रमुख नियुक्त किया गया है। यह एक बहुत ही जिम्मेदार स्थिति है, आप गंदगी का सामना नहीं कर सकते हैं, जिसका अर्थ है कि आपको एक प्रोटोटाइप उत्पाद बनाने के लिए जल्द से जल्द विकास विभाग को निर्देश देने की आवश्यकता है। और इसलिए, कंपनी का सबसे अच्छा दिमाग snek.py पर काम करना शुरू करता है:
ascii_snek = """\ --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` """ def main(): print(ascii_snek) if __name__ == '__main__': main()
थोड़ी देर बाद, शेयरधारकों की बैठक में, आप गर्व से पहले परिणाम प्रदर्शित करते हैं!
$ python snek.py --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'`
सेवा के रूप में साँप
दुर्भाग्य से, औसत उपभोक्ता ने अभी तक पायथन में महारत हासिल नहीं की है और दुभाषिया या स्थान के बारे में सोचने के बिना कंसोल से प्रोग्राम चलाना चाहता है। खैर, हमारे सर्वश्रेष्ठ विशेषज्ञ सबसे अच्छे हैं जो स्क्रिप्ट को पैक करने में सक्षम थे ताकि यह स्थापना के दौरान स्वचालित रूप से एक कंसोल कमांड बनाए।
पुनर्वितरण योग्य पैकेज बनाने के लिए, हमें
setup.py फ़ाइल की आवश्यकता होती है, जिसमें निर्भरता, लाइसेंस आदि के बारे में जानकारी होती है। इसके अलावा, आप इसमें प्रवेश बिंदु निर्दिष्ट कर सकते हैं:
from setuptools import setup setup( name='snek', entry_points={ 'console_scripts': [ 'snek = snek:main', ], } )
कंसोल_ स्क्रिप्ट , जैसा कि विशेषज्ञों ने समझाया है, एक विशेष प्रवेश बिंदु है।
setuptools अपने तत्वों को
"<कंसोल स्क्रिप्ट> = <पथ को पायथन ऑब्जेक्ट>" के रूप में पढ़ता है, पैकेज को स्थापित करते समय प्रत्येक तत्व के लिए एक कंसोल उपयोगिता
बनाता है।
अभी के लिए, आइए स्रोतों से स्क्रिप्ट को संस्थापित करें:
$ 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
वर्ष के परिणामों के लिए समर्पित सम्मेलन में, आप नवीनतम विकास का प्रदर्शन करते हुए बोलते हैं:
$ snek --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'`
हर घर में एक सांप
साँप दुनिया पर विजय प्राप्त करता है। कंपनी ने एक आईपीओ आयोजित किया और इसकी कीमत $ 60 बिलियन थी। हिपस्टर्स एक नए, स्टाइलिश, फैशनेबल और युवा सांप की मांग करते हैं। और अगर मांग है, तो एक प्रस्ताव होगा:
""" 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()
हिपस्टर्स रोमांचित हैं:
$ snek --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` $ snek --type fancy _,..,,,_ '``````^~"-,_`"-,_ .-~c~-. `~:. ^-. `~~~-.c ; `:. `-, _.-~~^^~:. `. ; _,--~~~~-._ `:. ~. .~ `. .` ;' .:` `: `:. ` _.:-,. `. .' .: :' _.-~^~-. `. `..' .: `. ' : .' _:' .-' `. :. .: .'`. : ; : `-' .:' `. `^~~^` .:. `. ; ; `-.__,-~ ~-. ,' ': '.__.` :' ~--..--' ':. .:' ':..___.:'
ट्रांसनैशनल स्नेक
लाखों लोग सांप के बिना अपने दिन की कल्पना नहीं कर सकते। Google के अधिग्रहण के बाद भी, ज़ीमिका के संसाधन दुनिया भर के उपयोगकर्ताओं की आवश्यकताओं को पूरा करने के लिए पर्याप्त नहीं हैं। ऐसा लगता है कि अब समय आ गया है कि हम लोगों को हमारे बुनियादी ढांचे के आधार पर अपने साँप बनाने का अवसर दें।
""" 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()
अब, हर बार जब
स्नेक को लॉन्च किया जाता है, तो यह
स्नेक_टाइप्स एंट्री
पॉइंट का उपयोग करके सिस्टम में पंजीकृत अन्य सांपों की खोज करता है। प्रत्येक ऐसे साँप को उसके प्रकार के नाम से पंजीकृत किया जाता है, जो आपको सांप के मापदंडों के आधार पर वांछित साँप का चयन करने की अनुमति देता है।
सभी सबसे महत्वपूर्ण बात
get_sneks के अंदर
होती है ।
Pkg_resources.iter_entry_point ('snek_types') को कॉल करने से आप कहीं भी
"snek_types" नाम से पंजीकृत सभी प्रवेश बिंदुओं से
गुजर सकते हैं । इस प्रकार, कोई भी तृतीय-पक्ष पैकेज हमारी स्क्रिप्ट के लिए लोड किए जाने के लिए अपने
सेटअप में प्रवेश बिंदु
"स्नेक_टाइप्स" बनाने में सक्षम होगा।
हमने स्नेक सॉल्यूशंस एलएलसी से अपने सहयोगियों
को स्नेक_टाइप्स के बारे में बात की, और उन्होंने तुरंत अपने सपनों का साँप बनाना शुरू कर दिया। इस तरह उनका
प्यारा_स्नेकहोम पैकेज
आया :
cute_snek = r""" /^\/^\ _|__| O| \/ /~ \_/ \ \____|__________/ \ \_______ \ `\ \ \ | | \ / / \ / / \ / / \ \ / / \ \ / / _----_ \ \ / / _-~ ~-_ | | ( ( _-~ _--_ ~-_ _/ | \ ~-____-~ _-~ ~-_ ~-_-~ / ~-_ _-~ ~-_ _-~ ~--______-~ ~-___-~ """
और यहां बताया गया है कि उन्होंने अपने
सेटअप को कैसे लागू किया ताकि हमारा सांप उनके सांप को लोड कर सके:
from setuptools import setup setup( name='cute_snek', entry_points={ 'snek_types': [ 'cute = cute_snek: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
अब, सांप को
दौड़ाकर , वे अपने साँप को प्रवेश के समय गतिशील रूप से लोड करके
क्यूट_सनेक पैकेज से बाहर निकाल सकते हैं:
$ snek --type cute /^\/^\ _|__| O| \/ /~ \_/ \ \____|__________/ \ \_______ \ `\ \ \ | | \ / / \ / / \ / / \ \ / / \ \ / / _----_ \ \ / / _-~ ~-_ | | ( ( _-~ _--_ ~-_ _/ | \ ~-____-~ _-~ ~-_ ~-_-~ / ~-_ _-~ ~-_ _-~ ~--______-~ ~-___-~
साँप 2.0
हालांकि शीर्ष प्रबंधन का सारा ध्यान टैक्स इंस्पेक्टरेट और एंटीमोनोपॉली सेवा के साथ डिसाइड करने में चला जाता है, विकास विभाग अंत में कोड को रिफलेक्टर करने के लिए कुछ समय पा सकता है।
मुख्य प्रणाली वास्तुकार ने महसूस किया कि यदि तीसरे पक्ष के सांपों को प्लग-इन के रूप में डाउनलोड किया जा सकता है, तो अंतर्निहित सांपों को भी डाउनलोड किया जा सकता है।
हम निर्मित सांपों के विशेष प्रसंस्करण को हटाते हैं:
और बदले में, हम उनके लिए सार्वभौमिक प्रवेश बिंदु दर्ज करेंगे:
संशोधित सांप को फिर से स्थापित करें:
$ 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
परिणाम की जाँच करें:
$ snek --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` $ snek --type fancy _,..,,,_ '``````^~"-,_`"-,_ .-~c~-. `~:. ^-. `~~~-.c ; `:. `-, _.-~~^^~:. `. ; _,--~~~~-._ `:. ~. .~ `. .` ;' .:` `: `:. ` _.:-,. `. .' .: :' _.-~^~-. `. `..' .: `. ' : .' _:' .-' `. :. .: .'`. : ; : `-' .:' `. `^~~^` .:. `. ; ; `-.__,-~ ~-. ,' ': '.__.` :' ~--..--' ':. .:' ':..___.:' $ snek --type cute /^\/^\ _|__| O| \/ /~ \_/ \ \____|__________/ \ \_______ \ `\ \ \ | | \ / / \ / / \ / / \ \ / / \ \ / / _----_ \ \ / / _-~ ~-_ | | ( ( _-~ _--_ ~-_ _/ | \ ~-____-~ _-~ ~-_ ~-_-~ / ~-_ _-~ ~-_ _-~ ~--______-~ ~-___-~
वह सब है। अब आप जानते हैं कि पायथन में प्रवेश बिंदुओं का उपयोग कैसे करें!