पाइप के साथ एक पैकेज के कई संस्करणों को स्थापित करना


85

अपने आवेदन में मैं उपयोग करना चाहूंगा:

  • packageA, जिसकी ज़रुरत है packageX==1.3
  • packageB, जिसकी ज़रुरत है packageX==1.4
  • packageX==1.5

मैं packageXइस स्थिति को संभालने के लिए पाइप के साथ कई संस्करण कैसे स्थापित कर सकता हूं ?


2
गैर-मानक स्थानों पर पैकेज स्थापित करें, फिर आयात करने के लिए PYTHONPATH का उपयोग करें; इस उत्तर को
Yibo यांग

1
एक साइड नोट पर, इस प्रश्न में परिदृश्य, और वर्तमान में स्वीकृत जवाब में हैकी समाधान एक अच्छा उदाहरण है कि पैकेज के मालिक को अपनी निर्भरता के सटीक संस्करण को पिन करने के लिए क्यों नहीं और नहीं होना चाहिए। उन्हें उपयोग करना चाहिए था packageX>=1.3,<2और packageX>=1.4,<2(अपस्ट्रीम पैकेजएक्स को सिमेंटिक वर्जनिंग का अनुसरण करते हुए मान लिया गया है ), तब आपको डाउनस्ट्रीम ऐप डेवलपर के रूप में पिन करने और उपयोग करने में कोई समस्या नहीं packageX==1.5होगी और हर कोई खुश होगा। यहाँ अधिक जानकारी
रेउलू

जवाबों:


65

इससे पाइप आपकी मदद नहीं करेगा।

आप इसे एक विशिष्ट संस्करण स्थापित करने के लिए कह सकते हैं, लेकिन यह दूसरे को ओवरराइड करेगा। दूसरी ओर, दो वर्चुअन का उपयोग करके आप दोनों संस्करणों को एक ही मशीन पर स्थापित कर सकते हैं, लेकिन एक ही समय में उनका उपयोग नहीं करेंगे।

आप सबसे अच्छा शर्त दोनों संस्करण को मैन्युअल रूप से स्थापित करना है, उन्हें अपने पायथन पथ में एक अलग नाम से डालकर।

लेकिन अगर आपके दो परिवादों से उन्हें एक ही नाम (और उन्हें चाहिए) की उम्मीद है, तो आपको उन्हें संशोधित करना होगा, ताकि वे उस संस्करण को चुनें जो उन्हें कुछ आयात उर्फ ​​के साथ चाहिए जैसे:

import dependencyname_version as dependencyname

वर्तमान में ऐसा करने का कोई साफ तरीका नहीं है। सबसे अच्छी उम्मीद है कि आप इस हैक के लिए काम कर सकते हैं।

मैं इसके बजाय दो में से एक परिवाद को खोदता हूं और इसे एक समकक्ष के साथ प्रतिस्थापित करता हूं, या इसे निर्भरता के नए संस्करण को स्वीकार करने और समुदाय को पैच वापस देने के लिए पैच करता हूं।


43
क्या अब भी इसका कोई समाधान नहीं है?
13:20 पर Håken Lid

2
फिर भी कोई हल नहीं?
AjaxLeung

1
इतनी सारी भाषाओं में यह समस्या है ... जावा, गो, हैक्स ... उम्मीद है कि भाषा डिजाइनर वैश्विक पैकेज नेमस्पेस को छोड़ देंगे और भविष्य की भाषाओं में वे अधिक Node.js जैसे मॉड्यूल सिस्टम को अपनाएंगे, क्योंकि Node.js कई संस्करणों का समर्थन करता है निर्भरता।
एंडी

15

ईआर के लिए स्रोत डाउनलोड करें। पैकेज। प्रत्येक को अपने अलग फ़ोल्डर में स्थापित करें। उदाहरण के लिए। मेरे पास संस्करण 1.10 पैकेज था, लेकिन कुछ काम के लिए देव संस्करण पर स्विच करना चाहता था। मैंने देव मॉड्यूल के लिए स्रोत डाउनलोड किया: git clone https://github.com/networkx/networkx.git cd netwokrx मैंने इस संस्करण के लिए एक फ़ोल्डर बनाया: mkdir /home/username/opt/pythonफिर, मैंने PYTHONPATH env var को निम्न पर सेट किया export PYTHONPATH=/home/username/opt/python/lib/python2.7/site-packages/:। अगला, मैंने इसका उपयोग करके स्थापित किया:python setup.py install --prefix=/home/username/opt/python

अब, चूंकि मेरा PYTHONPATH अब इस दूसरी साइट-संकुल फ़ोल्डर की ओर इशारा कर रहा है, जब मैं कमांड लाइन पर पायथन को चलाता हूं, और नए मॉड्यूल को आयात करता हूं, तो यह काम करता है। स्विच को वापस स्विच करने के लिए, नया फ़ोल्डर PYTHONPATH से निकालें।

>>> import networkx as nx
>>> nx.__version__
'2.0.dev_20151209221101'

2
हाह, विशेष रूप से यहाँ आया क्योंकि मैं networkxसंस्करण मतभेदों से लड़ रहा हूँ !
dwanderson

"स्विच को वापस स्विच करने के लिए, PYTHONPATH से नया फ़ोल्डर निकालें।", नए फ़ोल्डर पथ को हटाने के बाद भी मेरे लिए यह हिस्सा काम नहीं कर रहा हैsys.path
अविनाश राज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.