2012-07-11 14 views
17

मेरे पास एक साधारण स्क्रिप्ट है जिसमें पार्सिंग जोन फ़ाइलों के लिए dnspython पर निर्भरता है। मैं इस स्क्रिप्ट को एक एकल .py के रूप में वितरित करना चाहता हूं कि उपयोगकर्ता इतने लंबे समय तक चल सकें क्योंकि उनके पास 2.6/2.7 इंस्टॉल है। मैं उपयोगकर्ता को निर्भरता साइट पर व्यापक रूप से स्थापित नहीं करना चाहता क्योंकि मौजूदा पैकेज/संस्करणों के साथ संघर्ष हो सकता है, और न ही मैं उन्हें वर्चुअलएन्व के साथ मिलना चाहता हूं। मैं सोच रहा था कि स्क्रिप्ट के अंदर dnspython जैसे पैकेज को एम्बेड करने का कोई तरीका था (gzip/base64) और उस स्क्रिप्ट को उस पैकेज को रनटाइम पर एक्सेस करें। शायद इसे एक डीआईआर में/tmp में अनपैक करें और sys.path में जोड़ें? मैं स्टार्टअप ओवरहेड के बारे में चिंतित नहीं हूं, मुझे बस एक ही चाहिए .py w/सभी निर्भरताओं में शामिल है कि मैं वितरित कर सकता हूं।क्या एक पायथन लिपि में निर्भरताओं को एम्बेड करने का कोई तरीका है?

इसके अलावा, केवल शुद्ध पायथन पैकेज बनाने के लिए कोई सी निर्भरता नहीं होगी।

संपादित करें: स्क्रिप्ट को एक .py होना आवश्यक नहीं है। बस इतना लंबा है क्योंकि यह एक निष्पादन योग्य फ़ाइल है।

+3

यदि आप एक फ़ाइल प्रतिबंध को आराम कर सकते हैं, तो आप अपनी .py फ़ाइल के साथ dnspython लाइब्रेरी को या तो ज़िप फ़ाइल के रूप में या एक नियमित स्टैंडअलोन फ़ाइल के रूप में पैकेज कर सकते हैं - जो निर्भरता समस्या को हल करेगा। क्या आप सिर्फ 1 फाइल रखने के बारे में अशिष्ट हैं? –

+4

नरक लाइसेंस करने के लिए सड़क एम्बेडिंग के साथ पक्का है ... –

+0

@ महमूद अब्देलकेडर मुझे लगता है कि काम करेगा। पाइथन अन्यत्र देखने से पहले पैकेज के लिए वर्तमान निर्देशिका में देखेगा (हालांकि मुझे लगता है कि यह ऑर्डर 3 में बदल रहा है)। फिर भी इच्छा है कि सभी निर्भरताओं को एक निष्पादन योग्य फ़ाइल के रूप में पैकेज करने का एक तरीका था जिसे उपयोगकर्ता चला सकता है और कोई समस्या नहीं है। मुझे लगता है कि यह एक .py होना जरूरी नहीं है। –

उत्तर

8

आप एकाधिक पायथन फ़ाइलों को एक .egg में पैकेज कर सकते हैं। अंडे की फाइलें अनिवार्य रूप से बस परिभाषित मेटाडेटा के साथ ज़िप अभिलेखागार हैं - यह देखने के लिए setuptools प्रलेखन को देखें। docs प्रति प्रविष्टि बिंदु निर्दिष्ट करके आप अंडा फ़ाइलों को सीधे निष्पादन योग्य बना सकते हैं। यह आपको एक निष्पादन योग्य फ़ाइल देगा जिसमें आपका कोड + कोई अन्य निर्भरता हो सकती है।

संपादित करें: आजकल मैं ऐसा करने के लिए एक पेक्स बनाने की सिफारिश करता हूं। pex मूल रूप से एक निष्पादन योग्य ज़िप फ़ाइल गैर stdlib निर्भरताओं के साथ है। इसमें एक अजगर वितरण नहीं है (जैसे py2app/py2exe) लेकिन बाकी सब कुछ रखता है और एक कमांड लाइन आमंत्रण के साथ बनाया जा सकता है। https://pex.readthedocs.org/en/latest/

+1

धन्यवाद, मैं अभी सेटअप सेटअप के साथ एक अंडे बनाने की कोशिश कर रहा था। मैंने पहले कभी अंडे नहीं बनाया है क्योंकि मैंने हमेशा सुना है कि वे पक्ष से बाहर हो गए हैं। –

2

कृपया ऐसा न करें। यदि आप इसकी आदत नहीं बनाते हैं।

  • pydns बीडीएस लाइसेंस प्राप्त है, लेकिन आप मुसीबत
  • में मिल सकता है अगर आप इस तरह से करने के लिए "एम्बेड" एक GPL मॉड्यूल की कोशिश आप setuptools उपयोग करने के लिए सीख सकते हैं और आप लंबे समय में बहुत अधिक खुशी मिलेगी
  • setuptools आपके द्वारा पहचाने गए निर्भरताओं के इंस्टॉल को संभालेगा (मुझे यकीन नहीं है कि यदि आप जिन पायदानों का उपयोग कर रहे हैं वह शुद्ध पायथन है तो आप अपने उपयोगकर्ताओं के लिए समस्याएं पैदा कर सकते हैं यदि आप इसे अपने पर्यावरण को जानने के बिना स्वयं को जोड़ने का प्रयास करते हैं)
  • एक यूआरएल या पीपीआई सेट करें ताकि लोग आपकी स्क्रिप्ट को easy_install -U
  • के साथ अपग्रेड कर सकें
+0

मैं जिस पैकेज का उपयोग कर रहा हूं वह dnspython है, pydns नहीं।यदि setuptools मुझे एक वितरित करने योग्य निष्पादन योग्य बना सकता है जिसे केवल Python 2.6/2.7 की आवश्यकता है, तो मैं इसका उपयोग करूंगा। यदि आप साइट पर निर्भरता स्थापित करने के लिए बस इसका उपयोग करने के लिए कह रहे हैं तो यह वह नहीं है जिसे मैं पूछ रहा था। dnspython शुद्ध पायथन है और मुझे इसके लाइसेंस में कुछ भी दिखाई नहीं देता है जो मुझे इसे एम्बेड करने से रोक देगा। अंतिम उपयोगकर्ता डेवलपर्स नहीं हैं और पाइथन पारिस्थितिकी तंत्र (setuptools/easy_install/pip/virtaulenv/आदि) के बारे में कुछ भी नहीं जानते हैं। –

3

सबसे आसान तरीका है कि आपकी पाइथन लिपि को __main__.py नामक एक शुद्ध संग्रह में शुद्ध पायथन निर्भरताओं के साथ example पर रखा जाए।

अन्यथा PyInstaller का उपयोग अकेले निष्पादन योग्य बनाने के लिए किया जा सकता है।

संबंधित मुद्दे