python - पायथन सॉफ्टवेयर को आसानी से कैसे वितरित करें जिसमें पायथन मॉड्यूल निर्भरता है? यूनिक्स पर पायथन पैकेज की स्थापना में निराशा




pip setuptools (2)

हम ऐसे सॉफ्टवेयर प्रोजेक्ट भी विकसित करते हैं जो सुन्न, चुस्त और अन्य PyPI पैकेजों पर निर्भर करते हैं। हैंड्स डाउन, रिमोट इंस्टॉलेशन के प्रबंधन के लिए वर्तमान में उपलब्ध सबसे अच्छा टूल zc.buildout । इसे इस्तेमाल करना बहुत आसान है। आप उनकी वेबसाइट से एक बूटस्ट्रैपिंग स्क्रिप्ट डाउनलोड करते हैं और अपने पैकेज के साथ वितरित करते हैं। आप एक "स्थानीय परिनियोजन" फ़ाइल लिखते हैं, जिसे सामान्य रूप से buildout.cfg कहा जाता है, यह बताता है कि स्थानीय रूप से पैकेज को कैसे स्थापित किया जाए। आप अपने पैकेज के साथ bootstrap.py फ़ाइल और buildout.cfg दोनों को शिप करते हैं - हम PyPI द्वारा वितरित ज़िप या टार बॉल के साथ इन दो फ़ाइलों के एम्बेडिंग को मजबूर करने के लिए अपने अजगर पैकेजों में MANIFEST.in फाइल का उपयोग करते हैं। जब उपयोगकर्ता इसे खोल देता है, तो उसे दो कमांड निष्पादित करनी चाहिए:

$ python bootstrap.py # this will download zc.buildout and setuptools
$ ./bin/buildout # this will build and **locally** install your package + deps

पैकेज संकलित किया गया है और सभी निर्भरता स्थानीय रूप से स्थापित की गई है , जिसका अर्थ है कि आपके पैकेज को स्थापित करने वाले उपयोगकर्ता को रूट विशेषाधिकारों की भी आवश्यकता नहीं है, जो कि एक अतिरिक्त सुविधा है। स्क्रिप्ट (सामान्य रूप से) के तहत रखी जाती हैं। / ./bin , इसलिए उपयोगकर्ता बस उसके बाद उन्हें निष्पादित कर सकता है। zc.buildout setuptools के साथ सहभागिता के लिए zc.buildout का उपयोग करता है, जिससे आपको बॉक्स से बाहर काम करने की उम्मीद है।

आप बहुत आसानी से zc.buildout विस्तार कर सकते हैं यदि वह सभी शक्ति पर्याप्त नहीं है - आप तथाकथित "व्यंजनों" का निर्माण करते हैं जो उपयोगकर्ता को अतिरिक्त कॉन्फ़िगरेशन फ़ाइलों को बनाने में मदद कर सकता है, नेट या इंस्टेंट कस्टम प्रोग्राम से अन्य सामान डाउनलोड कर सकता है। zc.buildout वेबसाइट में एक वीडियो ट्यूटोरियल होता है जो विवरण में समझाता है कि zc.buildout का उपयोग कैसे करें और इसे कैसे बढ़ाया जाए। हमारी परियोजना Bob वैज्ञानिक उपयोग के लिए पैकेज वितरित करने के लिए बिल्डआउट का व्यापक उपयोग करती है। यदि आप चाहें, तो कृपया निम्नलिखित पृष्ठ पर जाएं जिसमें हमारे डेवलपर्स के लिए विस्तृत निर्देश हैं कि वे अपने अजगर पैकेज को कैसे सेट कर सकते हैं ताकि अन्य लोग zc.buildout का उपयोग करके स्थानीय रूप से उन्हें बना और स्थापित कर zc.buildout

मेरा लक्ष्य एक पायथन पैकेज वितरित करना है जिसमें निर्भरता के रूप में कई अन्य व्यापक रूप से उपयोग किए जाने वाले पायथन पैकेज हैं। मेरा पैकेज अच्छी तरह से लिखित, पिपी-इंडेक्स किए गए पैकेज जैसे पांडा, स्काईपी और सुपीह पर निर्भर करता है, और सेटअपहोम में निर्दिष्ट करता है कि इनमें से कुछ संस्करणों या उच्चतर की आवश्यकता है, जैसे "numpy> = 1.5"।

मैंने पाया कि यह बेहद निराशाजनक है और यूनिक्स के जानकार उपयोगकर्ताओं के लिए लगभग असंभव है जो पाइथन पैकेजिंग के विशेषज्ञ नहीं हैं (भले ही वे पायथन को लिखना जानते हों) मेरा जैसे पैकेज को स्थापित करने के लिए, यहां तक ​​कि उन पैकेजों का उपयोग करने में आसान होने के लिए क्या करना चाहिए। । मैं सोच रहा हूं कि क्या इस दर्दनाक प्रक्रिया का कोई विकल्प है जो कोई पेश कर सकता है, या अगर मेरा अनुभव सिर्फ पायथन पैकेजिंग और वितरण की बहुत कठिन वर्तमान स्थिति को दर्शाता है।

मान लीजिए कि उपयोगकर्ता आपके पैकेज को अपने सिस्टम पर डाउनलोड करते हैं। अधिकांश इसे "भोलेपन" से स्थापित करने का प्रयास करेंगे, जैसे कुछ:

$ python setup.py install

यदि आप पायथन पैकेजों को स्थापित करने के बारे में निर्देश देते हैं, तो आमतौर पर यही होता है। यह अधिकांश उपयोगकर्ताओं के लिए विफल हो जाएगा, क्योंकि अधिकांश का यूनिक्स / लिनक्स सर्वरों पर रूट एक्सेस नहीं है। अधिक खोज के साथ, वे "--prefix" विकल्प की खोज करेंगे और कोशिश करेंगे:

$ python setup.py install --prefix=/some/local/dir

चूंकि उपयोगकर्ता पायथन पैकेजिंग की पेचीदगियों के बारे में नहीं जानते हैं, इसलिए वे एक मनमाना निर्देशिका को एक तर्क के रूप में --prefix , जैसे "~/software/mypackage/" --prefix "~/software/mypackage/" --prefix । यह एक स्पष्ट रूप से क्यूरेट निर्देशिका नहीं होगी जहां अन्य सभी पायथन पैकेज रहते हैं, क्योंकि फिर से, अधिकांश उपयोगकर्ताओं को इन विवरणों के बारे में पता नहीं है। यदि वे एक और पैकेज "मायोथेरपैक" स्थापित करते हैं, तो वे इसे "~/software/myotherpackage" कर सकते हैं, और आप कल्पना कर सकते हैं कि कैसे यह सड़क PYTHONPATH की निराशाजनक हैकिंग और अन्य जटिलताओं को जन्म देगी।

स्थापना प्रक्रिया के साथ जारी रखते हुए, "--prefix" "setup.py install" साथ "setup.py install" करने के लिए कॉल विफल हो जाएगा एक बार जब उपयोगकर्ता पैकेज का उपयोग करने की कोशिश करते हैं, भले ही यह सही ढंग से स्थापित किया गया हो, क्योंकि निर्भरता में से एक गायब हो सकता है (उदाहरण पंडों, घसीटना या सुन्न) और एक पैकेज प्रबंधक का उपयोग नहीं किया जाता है। वे इन पैकेजों को व्यक्तिगत रूप से स्थापित करने का प्रयास करेंगे। सफल होने पर भी, पैकेज अनिवार्य रूप से "--prefix" को दिए गए गैर-मानक निर्देशिकाओं के कारण PYTHONPATH में नहीं होंगे और रोगी उपयोगकर्ता दिखाई देने के लिए निर्भरता प्राप्त करने के लिए अपने PYTHONPATH संशोधनों के साथ "--prefix" देंगे।

इस स्तर पर, उपयोगकर्ताओं को पायथन प्रेमी दोस्त द्वारा बताया जा सकता है कि उन्हें सॉफ्टवेयर को स्थापित करने और निर्भरता का ख्याल रखने के लिए "easy_install" , मुख्यधारा के प्रबंधक जैसे पैकेज प्रबंधक का उपयोग करना चाहिए। "easy_install" स्थापित करने के बाद, जो मुश्किल हो सकता है, वे कोशिश करेंगे:

$ easy_install setup.py 

यह भी विफल हो जाएगा, क्योंकि उपयोगकर्ताओं को फिर से उत्पादन यूनिक्स सर्वर पर वैश्विक रूप से सॉफ़्टवेयर स्थापित करने की अनुमति नहीं है। अधिक पढ़ने के साथ, वे "--user" विकल्प के बारे में जानेंगे, और कोशिश करेंगे:

$ easy_install setup.py --user 

उन्हें त्रुटि मिलेगी:

usage: easy_install [options] requirement_or_url ...
   or: easy_install --help

error: option --user not recognized

वे बेहद हैरान होंगे कि उनके easy_install पास --user विकल्प क्यों नहीं है जहां विकल्प का वर्णन करने वाले स्पष्ट रूप से ऑनलाइन पृष्ठ हैं। वे अपने easy_install को नवीनतम संस्करण में अपग्रेड करने का प्रयास कर सकते हैं और पाते हैं कि यह अभी भी विफल है।

यदि वे पायथन पैकेजिंग विशेषज्ञ को जारी रखते हैं और परामर्श करते हैं, तो उन्हें पता चलेगा कि easy_install दो संस्करण हैं, दोनों को " easy_install" नाम दिया गया है ताकि भ्रम को अधिकतम किया जा सके, लेकिन "वितरित" का एक हिस्सा और "setuptools" का दूसरा भाग। ऐसा होता है कि केवल "--user" "easy_install" का "distribute" को "distribute" सपोर्ट "--user" और सर्वर / "--user" के विशाल बहुमत में "setuptools" स्थापित "setuptools" और इसलिए स्थानीय इंस्टॉलेशन संभव नहीं होगा। ध्यान रखें कि "distribute" और "setuptools" बीच के ये अंतर उन लोगों के लिए समझने में व्यर्थ और कठिन हैं जो पायथन पैकेज प्रबंधन के विशेषज्ञ नहीं हैं।

इस बिंदु पर, मैंने अपने सॉफ्टवेयर पैकेज को स्थापित करने की कोशिश करने वाले सबसे अधिक दृढ़, समझदार और रोगी उपयोगकर्ताओं का 90% भी खो दिया होगा - और ऐसा ही सही! वे एक सॉफ्टवेयर स्थापित करना चाहते थे जो पाइथन में लिखा जाना था, कला पायथन पैकेज वितरण के विशेषज्ञ बनने के लिए नहीं, और यह बहुत भ्रामक और जटिल है। वे हार मान लेंगे और समय बर्बाद होने पर निराश होंगे।

उन उपयोगकर्ताओं के छोटे अल्पसंख्यक जो जारी रखते हैं और अधिक पायथन विशेषज्ञों से पूछते हैं, उन्हें बताया जाएगा कि उन्हें easy_install बजाय pip/virtualenv का उपयोग करना चाहिए। pip और virtualenv स्थापित करना और यह पता लगाना कि ये उपकरण कैसे काम करते हैं और वे पारंपरिक "python setup.py" से कैसे अलग हैं या "easy_install" कॉल अपने आप में समय लेने वाली और मुश्किल है, और फिर से उन उपयोगकर्ताओं से भी बहुत कुछ पूछना है जो अभी चाहते थे। पायथन सॉफ्टवेयर का एक सरल टुकड़ा स्थापित करें और इसका उपयोग करें। यहां तक ​​कि जो लोग इस रास्ते को आगे बढ़ाते हैं, उन्हें यह भ्रम हो जाएगा कि क्या वे जो कुछ निर्भरताएँ स्थापित करते हैं, जो कि easy_install या setup.py install --prefix अभी भी pip/virtualenv साथ प्रयोग करने योग्य हैं या यदि सब कुछ खरोंच से पुनर्स्थापित किया जाना है।

यदि एक या एक से अधिक संकुल विचाराधीन है, तो डिफ़ॉल्ट रूप से पाइथन के भिन्न संस्करण को स्थापित करने पर निर्भर करता है, तो यह समस्या समाप्त हो जाती है। यह सुनिश्चित करने की कठिनाई कि आपका पायथन पैकेज मैनर आप इसे चाहते हैं पायथन संस्करण का उपयोग कर रहा है, और यह कि आवश्यक निर्भरताएँ प्रासंगिक पायथन 2.x निर्देशिका में स्थापित की गई हैं और पायथन 2.y नहीं, उपयोगकर्ताओं के लिए इतनी निराशा होगी कि वे निश्चित रूप से उस स्तर पर छोड़ देंगे।

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

क्या पायथन के लिए एक समकक्ष है? सॉफ्टवेयर को इस तरह से वितरित करने का एक तरीका जो इन सभी निर्भरता और संस्करणों का पीछा करने वाले उपयोगकर्ताओं पर निर्भर नहीं करता है? शायद सभी संबंधित पैकेजों को आत्म-सम्‍मिलित करने के लिए सभी प्रासंगिक पैकेजों को संकलित करने का एक तरीका जो केवल बाइनरी के रूप में डाउनलोड और उपयोग किया जा सकता है?

मैं इस बात पर जोर देना चाहूंगा कि यह हताशा यूनिक्स उपयोगकर्ताओं को एक पैकेज वितरित करने के संकीर्ण लक्ष्य के साथ भी होती है, जो कि क्रॉस प्लेटफॉर्म मुद्दों के बारे में चिंता न करके समस्या को सरल बनाता है, आदि। मेरा मानना ​​है कि उपयोगकर्ता यूनिक्स प्रेमी हैं, और हो सकता है पायथन को जानें, लेकिन पायथन पैकेजिंग और विभिन्न पैकेज मैनेजरों की आंतरिक जटिलताओं / प्रतिद्वंद्वियों की जानकारी के बारे में अभी पता नहीं है (और जागरूक नहीं होना चाहते हैं)। इस मुद्दे की एक विचलित करने वाली विशेषता यह है कि यह तब भी होता है जब आपके सभी पायथन पैकेज निर्भरताएं प्रसिद्ध, अच्छी तरह से लिखित और अच्छी तरह से बनाए हुए पिपी-उपलब्ध पैकेज हैं जैसे कि पंड, स्काइप और नेम्पी। यह ऐसा नहीं है कि मैं कुछ अस्पष्ट निर्भरता पर भरोसा कर रहा हूं जो ठीक से गठित पैकेज नहीं हैं: बल्कि, मैं सबसे मुख्यधारा पैकेजों का उपयोग कर रहा था, जो कई पर निर्भर हो सकते हैं।

इस पर कोई मदद या सलाह बहुत सराहना की जाएगी। मुझे लगता है कि पायथन महान पुस्तकालयों के साथ एक महान भाषा है, लेकिन मुझे इसमें लिखे गए सॉफ़्टवेयर (एक बार निर्भरता होने के बाद) को वितरित करना लगभग असंभव है जो लोगों के लिए स्थानीय स्तर पर स्थापित करना और बस चलाना आसान है। मैं स्पष्ट करना चाहूंगा कि जो सॉफ्टवेयर मैं लिख रहा हूं, वह प्रोग्रामेटिक उपयोग के लिए पायथन लाइब्रेरी नहीं है, लेकिन सॉफ्टवेयर जिसमें निष्पादन योग्य स्क्रिप्ट हैं जो उपयोगकर्ता व्यक्तिगत कार्यक्रमों के रूप में चलाते हैं। धन्यवाद।


हम वर्तमान में उपयोगकर्ताओं को प्लेटफ़ॉर्म स्वतंत्र तरीके से (विशेष रूप से https://python-packaging-user-guide.readthedocs.org/en/latest/future.html देखें) प्लेटफ़ॉर्म सॉफ़्टवेयर स्थापित करना आसान बनाने के लिए काम कर रहे हैं। http://www.python.org/dev/peps/pep-0453/ )

अभी के लिए, easy_install के दो प्रतिस्पर्धी संस्करणों के साथ समस्या का समाधान किया गया है, प्रतिस्पर्धा कांटा "वितरण" को विकास के मुख्य बिंदुओं में सेट करने के बाद विलय कर दिया गया है।

क्रॉस-प्लेटफ़ॉर्म वितरण और पायथन सॉफ़्टवेयर की स्थापना पर वर्तमान में उपलब्ध सर्वोत्तम सलाह यहाँ कैप्चर की गई है: https://packaging.python.org/





distribute