पायथन के प्रवेश बिंदु बताएं?


181

मैंने Pylons और पीक पृष्ठों पर अंडे के प्रवेश बिंदुओं पर प्रलेखन पढ़ा है, और मुझे अभी भी वास्तव में समझ नहीं आया है। क्या कोई उन्हें मुझे समझा सकता है?

जवाबों:


168

एक "एंट्री पॉइंट" आम तौर पर एक फ़ंक्शन (या अन्य कॉल करने योग्य फ़ंक्शन-लाइक ऑब्जेक्ट) है जो आपके पायथन पैकेज के एक डेवलपर या उपयोगकर्ता का उपयोग करना चाह सकता है, हालांकि एक गैर-कॉल करने योग्य ऑब्जेक्ट को प्रवेश बिंदु के रूप में (सही रूप में) भी आपूर्ति की जा सकती है टिप्पणियों में बताया!)।

प्रवेश बिंदु का सबसे लोकप्रिय प्रकार कंसोल_स्क्रिप्स एंट्री पॉइंट है, जो एक फ़ंक्शन को इंगित करता है जिसे आप कमांड-लाइन टूल के रूप में उपलब्ध कराना चाहते हैं जो कोई भी आपके पैकेज को स्थापित करता है। यह आपके setup.py में जाता है:

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

मेरे पास एक पैकेज है जिसे मैंने केवल "कर्सिवटूल" कहा है, और मैं चाहता था कि यह एक "कर्सिव" कमांड उपलब्ध कराए, जिसे कोई भी कमांड लाइन से चला सके, जैसे:

$ cursive --help
usage: cursive ...

ऐसा करने का तरीका एक फ़ंक्शन को परिभाषित करता है, जैसे कि शायद शापित / उपकरण / cmd.py में "सरसरी_कमांड" फ़ंक्शन ऐसा लगता है:

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

इत्यादि; यह मान लेना चाहिए कि इसे कमांड लाइन से बुलाया गया है, उपयोगकर्ता द्वारा प्रदान किए गए तर्कों को पार्स करें, और ... ठीक है, जो भी कमांड करने के लिए डिज़ाइन किया गया है वह करें।

स्थापित docutils प्रवेश बिंदु उपयोग की एक महान उदाहरण के लिए पैकेज: यह अन्य स्वरूपों के लिए अजगर प्रलेखन परिवर्तित करने के लिए एक आधा दर्जन उपयोगी आदेशों की तरह कुछ स्थापित हो जाएगा।


3
वर्तमान docutils 'में setup.pyबिल्कुल नहीं है entry_points
मैट विल्की

2
यह एक उत्कृष्ट उत्तर है क्योंकि यह एकल प्रविष्टि_ पॉइंट समूह नाम साझा करने वाली कई परियोजनाओं की शक्ति को प्रदर्शित करता है, जो "कंसोल_ स्क्रिप्ट्स" है। इस उत्तर की तुलना पेट्री द्वारा अधिक सामान्य उत्तर से करें। आप देखेंगे कि setuptools कंसोल / स्क्रिप्ट्स प्राप्त करने के लिए इस pkg_resource तंत्र का उपयोग कर रहे होंगे और फिर उनके चारों ओर एक शेल आवरण बना सकते हैं। प्रेरणादायक? इन का उपयोग करें। वे केवल कंसोल_ स्क्रिप्ट से अधिक के लिए अच्छे हैं।
ब्रूनो ब्रॉन्स्की

188

एंट्रीपॉइंट्स एक निरंतर, फ़ाइल-सिस्टम-आधारित ऑब्जेक्ट नाम पंजीकरण और नाम-आधारित प्रत्यक्ष ऑब्जेक्ट आयात तंत्र ( सेट-अप पैकेज द्वारा कार्यान्वित ) प्रदान करते हैं।

वे पायथन ऑब्जेक्ट्स के नामों को फ्री-फॉर्म आइडेंटिफ़ायर के साथ जोड़ते हैं। तो एक ही पायथन इंस्टॉलेशन का उपयोग करने वाला कोई भी कोड और पहचानकर्ता को किसी वस्तु को संबंधित नाम से एक्सेस कर सकते हैं, चाहे वह कोई भी वस्तु क्यों न हो। जुड़े नाम किसी भी एक पायथन मॉड्यूल में मौजूदा नाम हो सकता है ; उदाहरण के लिए एक वर्ग, फ़ंक्शन या चर का नाम। प्रविष्टि बिंदु तंत्र को परवाह नहीं है कि नाम क्या संदर्भित करता है, जब तक कि यह आयात करने योग्य है।

एक उदाहरण के रूप में, आइए एक फ़ंक्शन का उपयोग करें (एक के नाम पर), और एक काल्पनिक अजगर मॉड्यूल के साथ एक पूर्ण-योग्य नाम 'myns.mypkg.mymodule':

def the_function():
   "function whose name is 'the_function', in 'mymodule' module"
   print "hello from the_function"

प्रविष्टि बिंदुओं को एक प्रविष्टि बिंदुओं के माध्यम से setup.py में पंजीकृत किया जाता है। 'My_ep_func' नामक एंट्रीपॉइंट के तहत the_function रजिस्टर करने के लिए:

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

जैसा कि उदाहरण से पता चलता है, प्रवेश बिंदु समूहबद्ध हैं; एक समूह से संबंधित सभी प्रवेश बिंदुओं को देखने के लिए संबंधित एपीआई है (उदाहरण के लिए नीचे)।

एक पैकेज इंस्टालेशन पर (यानी 'पायथन सेटअप ओरोमो इनस्टॉल' चल रहा है), उपरोक्त घोषणा सेटपूल द्वारा पार्स की गई है। यह तब विशेष फ़ाइल में पार्स की गई जानकारी लिखता है। उसके बाद, pkg_resources API ( सेप्टुपूल का हिस्सा) का उपयोग प्रवेश बिंदु को देखने और संबंधित नाम (ओं) के साथ ऑब्जेक्ट (ओं) तक पहुंचने के लिए किया जा सकता है:

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

यहां, सेटटॉप्स ने प्रवेश बिंदु की जानकारी पढ़ी जो विशेष फाइलों में लिखी गई थी। इसने प्रवेश बिंदु पाया, मॉड्यूल (myns.mypkg.mymodule) को आयात किया, और pkg_resources.load () पर कॉल करने पर वहां परिभाषित the_function को पुनः प्राप्त किया।

मान लें कि एक ही समूह आईडी के लिए कोई अन्य प्रवेश बिंदु पंजीकरण नहीं थे, तो the_function को कॉल करना सरल होगा:

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

इस प्रकार, जबकि पहली बार में समझ पाना थोड़ा मुश्किल है, प्रवेश बिंदु तंत्र वास्तव में उपयोग करने के लिए काफी सरल है। यह प्लगेबल पायथन सॉफ्टवेयर विकास के लिए एक उपयोगी उपकरण प्रदान करता है।


4
इस सारी प्रक्रिया में 'my_ep_func' नाम का उपयोग कहां किया जाता है? यह pkg_resources पुनरावृत्त द्वारा किसी भी चीज़ के लिए उपयोग नहीं किया जाता है।
कामिल किशन

2
@KamilKisiel: यहाँ उदाहरण के लिए इस्तेमाल उदाहरण में, प्रवेश बिंदु का नाम वास्तव में किसी भी चीज़ के लिए उपयोग नहीं किया गया है, और न ही इसकी आवश्यकता है; प्रविष्टि बिंदु का नाम किसी भी चीज़ के लिए उपयोग किया जाता है या नहीं, आवेदन पर निर्भर है। नाम केवल प्रविष्टि बिंदु उदाहरण के नाम विशेषता के रूप में उपलब्ध है ।
पेट्री

3
मुझे लगता है कि ep.name को त्यागना और name_objects को एक शब्दकोश के बजाय एक सूची बनाना भ्रमित कर रहा था इसलिए मैंने उत्तर संपादित किया। यह क्या उत्तर दिखाता है कि दोनों को नाम कहां से मिला और क्या उम्मीद है कि यह 'the_function' या 'my_ep_func' होगा। अन्यथा पाठक को अतिरिक्त दस्तावेज कहीं और खोजना पड़ता था। यह एक उत्कृष्ट उत्तर है और प्रविष्टि का सबसे छोटा, स्पष्ट विवरण है जो मैंने कभी देखा है!
ब्रूनो ब्रोंस्की मार्क

3
मैंने github पर एक प्रोजेक्ट बनाया है जो इस अवधारणा को प्रदर्शित करता है। github.com/RichardBronosky/entrypoint_demo
ब्रूनो ब्रोंस्की

1
यह प्रवेश बिंदुओं की एक बहुत स्पष्ट व्याख्या है, कि आप विस्तृत विवरण के लिए। EntryPointsहालांकि स्पष्टीकरण बहुत स्पष्ट है लिंक, पुराना है।
राहुल नायर

18

सार बिंदु से, प्रवेश बिंदुओं का उपयोग पाइथन कॉलिबल के एक सिस्टम-वाइड रजिस्ट्री को बनाने के लिए किया जाता है जो कुछ इंटरफेस को लागू करते हैं। Pkg_resources में API हैं, यह देखने के लिए कि कौन से एंट्री पॉइंट्स किसी दिए गए पैकेज द्वारा विज्ञापित किए जाते हैं और साथ ही APIs यह निर्धारित करने के लिए कि कौन से पैकेज एक निश्चित एंट्री पॉइंट का विज्ञापन करते हैं।

एंट्री पॉइंट एक पैकेज के उपयोग के लिए उपयोगी होते हैं जो अन्य पैकेज में प्लगइन्स का उपयोग करते हैं। उदाहरण के लिए, इयान बेकिंग की पेस्ट परियोजना में प्रवेश बिंदुओं का बड़े पैमाने पर उपयोग किया गया है। इस स्थिति में, आप एक पैकेज लिख सकते हैं जो एंट्री पॉइंट का उपयोग करके अपने WSGI एप्लिकेशन कारखाने का विज्ञापन करता है paste.app_factory

प्रवेश बिंदुओं के लिए एक और उपयोग सिस्टम पर सभी पैकेजों की गणना कर रहा है जो कुछ प्लगइन कार्यक्षमता प्रदान करते हैं। TurboGears वेब रूपरेखा का उपयोग करता है python.templating.enginesकि स्थापित किया है और उपलब्ध कर रहे हैं templating पुस्तकालयों को देखने के लिए प्रवेश बिंदु।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.