2012-02-08 12 views
5

मेरे पास दो पैकेज हैं जो एक ही नाम के साथ विभिन्न पैकेज स्थापित करते हैं। वे दोनों "पैकेज" हैं जिनमें उनके शीर्ष-स्तर setup.py फ़ाइलें हैं जो setup कमांड में package=['foo'] निर्दिष्ट करती हैं।पायथन: एक ही नाम के साथ दो पैकेज; आप कैसे निर्दिष्ट करते हैं कि लोड किया गया है?

यदि मैं distutils.core का उपयोग कर स्थापित करता हूं, तो इंस्टॉल करने वाला अंतिम पिछले एक को ओवरराइट करता है (लेकिन मुझे लगता है कि जब तक .py फ़ाइलों में सभी समान नाम नहीं थे तब तक ओवरराइट नहीं होगा?)। अगर मैं setuptools का उपयोग कर स्थापित करता हूं, तो दो पैकेज विभिन्न अंडों में स्थापित हो जाते हैं।

पैकेज विकल्प आयात करने से पहले एक विकल्प स्पष्ट रूप से sys.path सेट करना होगा; ऐसा लगता है कि "अन-पायथनिक" और बदसूरत है।

मान लीजिए कि मेरे पास सेटअप दो से अलग eggs में स्थापित इन दो समान नामित संकुल हैं, मैं कैसे निर्दिष्ट कर सकता हूं?

+0

जिज्ञासा से बाहर, वे कौन से पैकेज हैं? –

+2

यह पहली जगह में स्थापित नाम के साथ 2 पैकेज होने के लिए काफी अस्पष्ट है, आईएमओ। – geoffspear

+0

http://pypi.python.org/pypi/pydns और http://pypi.python.org/pypi/dnspython दिमाग में आते हैं। एक DNS का उपयोग करता है जबकि अन्य नाम के रूप में डीएनएस का उपयोग करता है। – Zart

उत्तर

1

Setuptools guide उल्लेख --multi-संस्करण (-m) स्विच कि sys.path पूरी तरह से से पैकेज को हटा। sys.path को ठीक करने के लिए आपको जितनी जल्दी हो सके अपने कोड में pkg_resources.require ('package == version') का उपयोग करना होगा। यह सलाह easy_install हमेशा प्रिंट करता है जब कोई -m का उपयोग करता है।

लेकिन आप दोनों एक बार में आयात नहीं कर सकते हैं (जब तक उन्हें namespace packages का उपयोग करके ऐसा करने के लिए डिज़ाइन नहीं किया गया हो)।

+0

यह एक अच्छा समाधान है, लेकिन ऐसा लगता है कि यह केवल 'विकास' कमांड के साथ काम करता है; क्या 'इंस्टॉल' कमांड के लिए कोई विकल्प है? – keflavich

+0

विकास सिर्फ एक विशिष्ट प्रकार की जगह स्थापित है। -एम भी स्थापित करने के लिए काम करता है। मैं अक्सर पैकेज को लाने के लिए "easy_install -zmaxd/output/directory packagename" का उपयोग करता हूं और इसकी निर्भरता पाइप से होती है और उन्हें सभी अंडों में बनाती है।फिर मैं उन्हें वर्चुअल एनवी में या जो भी "venv/bin/easy_install -f/output/dir packagename" के साथ स्थापित करता हूं, डाउनलोड/निर्माण पर बहुत समय बचाता है। हालांकि पीआईपी बाइनरी अंडे का समर्थन नहीं करता है। – Zart

+0

यह करता है? अगर मैं 'python setup.py install-m' या' pip इंस्टॉल [name] -m' (या install/-m के क्रम को उलट देता हूं) का प्रयास करता हूं, तो मुझे 'त्रुटि: विकल्प -एम मान्यता प्राप्त नहीं है'। यह केवल 'easy_install' के साथ काम करता है, जो मुझे लगता है कि एक कामकाज है, लेकिन अगर कोई पाइप का उपयोग करता है तो क्या होगा? – keflavich

0

मुझे लगता है कि काम करने का सबसे अच्छा तरीका, अपूर्ण निर्देशिका का नाम बदलना होगा, जब तक कि अन्य पैकेज उस पैकेज पर निर्भर न हों।

आप setup.py को बदलकर या साइट-पैकेज में नाम फ़ोल्डर को सीधे बदलकर ऐसा कर सकते हैं। अंडे सिर्फ मेटा डेटा है।

जहां तक ​​sys.path सेट करना है, एक .pth फ़ाइल बनाकर, साइट मॉड्यूल का उपयोग करना बेहतर है। तत्काल होने पर, उस फ़ाइल में स्थित किसी भी पथ को अजगर पथ के "सिर" में जोड़ा जाएगा।

क्या ये दो पैकेज अलग हैं और नामांकन एक संयोग है, या क्या वे बस इसकी शाखाएं हैं?

+0

इसकी दो शाखाएं; अलग-अलग कार्यों के लिए आवश्यक विभिन्न शाखाएं। – keflavich

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

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