सेटअप आवश्यकताओं में विस्थापन आवश्यकताओं का उपयोग कैसे करें?


94

मैं virtualnv के साथ पाइप का उपयोग कर रहा हूँ पैकेज और कुछ पायथन पुस्तकालयों को स्थापित करने के लिए।

मुझे लगता है कि मैं क्या कर रहा हूँ एक बहुत ही सामान्य परिदृश्य है। मैं कई पुस्तकालयों का अनुरक्षक हूं जिनके लिए मैं निर्भरता को स्पष्ट रूप से निर्दिष्ट कर सकता हूं। मेरे कुछ पुस्तकालय तीसरे पक्ष के पुस्तकालयों पर निर्भर हैं, जिनमें परिवर्तनशील निर्भरताएँ हैं, जिन पर मेरा कोई नियंत्रण नहीं है।

जो कुछ मैं हासिल करने की कोशिश कर रहा हूं, वह pip installमेरे सभी पुस्तकालयों में से एक पर निर्भर है, ताकि इसके सभी अपस्ट्रीम निर्भरता को डाउनलोड / इंस्टॉल किया जा सके। क्या मैं पाइप प्रलेखन के साथ संघर्ष कर रहा हूँ अगर / कैसे आवश्यकताओं फ़ाइलों को अपने दम पर ऐसा कर सकते हैं या अगर वे वास्तव में उपयोग करने के लिए सिर्फ एक पूरक हैं install_requires

क्या मैं install_requiresनिर्भरता और संस्करण श्रेणियों को निर्दिष्ट करने के लिए अपने सभी पुस्तकालयों में उपयोग करूंगा और फिर एक संघर्ष को हल करने और / या उत्पादन के लिए उन्हें फ्रीज करने के लिए केवल आवश्यकताओं की फाइल का उपयोग कर सकता हूं?

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

यहाँ पर इसी तरह के बहुत सारे प्रश्न हैं, लेकिन मुझे ऐसा कोई भी नहीं मिला जो एक या दूसरे का उपयोग करने या उन दोनों को एक साथ उपयोग करने के रूप में बुनियादी हो।


3
यह बहुत अच्छा लेख है जो दोनों के संबंधों की व्याख्या करता है, और यह भी कि वे कैसे एकीकृत करते हैं।
ब्योर्न पोलेक्स

जवाबों:


68

मेरा दर्शन यह है कि आपको जो install_requiresचाहिए वह न्यूनतम इंगित करना चाहिए। इसमें संस्करण आवश्यकताएँ शामिल हो सकती हैं यदि आप जानते हैं कि कुछ संस्करण काम नहीं करेंगे; लेकिन इसमें ऐसी संस्करण आवश्यकताएँ नहीं होनी चाहिए, जहाँ आप सुनिश्चित नहीं हैं (उदाहरण के लिए, यदि आप निर्भरता के भविष्य में आपकी लाइब्रेरी को तोड़ेंगे या नहीं) तो आपको यकीन नहीं है।

दूसरी ओर आवश्यकताएँ फ़ाइलों को इंगित करना चाहिए कि आपको पता है कि क्या काम करता है , और आपके द्वारा अनुशंसित वैकल्पिक निर्भरताएं शामिल हो सकती हैं। उदाहरण के लिए आप SQLAlchemy का उपयोग कर सकते हैं, लेकिन MySQL का सुझाव दें, और इसलिए MySQLdb को आवश्यकताओं फ़ाइल में डाल दें)।

तो, संक्षेप में: install_requiresलोगों को उन चीजों से दूर रखना है जिन्हें आप जानते हैं कि वे काम नहीं करते हैं, जबकि आवश्यकताओं को उन चीजों की ओर लोगों को ले जाने के लिए फाइलें होती हैं जिन्हें आप काम करते हैं। इसका एक कारण यह है कि install_requiresआवश्यकताओं की हमेशा जाँच की जाती है, और वास्तव में पैकेज मेटाडेटा को बदले बिना अक्षम नहीं किया जा सकता है। इसलिए आप आसानी से एक नए संयोजन की कोशिश नहीं कर सकते। आवश्यकताएँ फ़ाइलें केवल स्थापित समय पर जाँच की जाती हैं।


5
क्या इसका मतलब है कि आपको setup.py install_requires=आईपीएस डिपो में जाना चाहिए requirements.txt?
विपुल

9
दोनों होने के बाद, setup.py में आवश्यकताओं और एक फ़ाइल फ़ाइल हालांकि खतरनाक है, क्योंकि दोहराव सिर्फ सिंक से बाहर बनने के लिए कहता है।
सेबेस्टियन ब्लास्क

1
इसके अलावा, आप वास्तव में इसके साथ कैसे काम करते हैं? मुझे लगता है, आप एक राज्य है कि निश्चित रूप से काम कर रहा है पाने के लिए आवश्यकताओं फ़ाइल का उपयोग करें। फिर पाइप के साथ वास्तविक पैकेज के साथ स्थापित करें। आप कभी भी उपयोग नहीं कर पाएंगे -Uक्योंकि यह आवश्यकताओं की फ़ाइल से निर्भरता को ओवरराइड कर सकता है? अपग्रेड कैसे करते हैं?
सेबस्टियन ब्लास्क

1
क्या यह उत्तर एप्लिकेशन और पैकेज पर समान रूप से लागू होता है? कुछ टूल (एक पैकेज) के आधार पर मेरे वेब-ऐप (एक ऐप) की कल्पना करें, जो दोनों अनुरोध पैकेज पर निर्भर करते हैं। यदि कुछ टूल में आवश्यकताएँ हैं। एक फ़ाइल जो अनुरोधों के एक विशेष संस्करण या संस्करण रेंज को पिन करती है, तो यह मेरे वेब-ऐप के लिए एक संभावित समस्या पैदा करती प्रतीत होगी, जिसमें शायद एक परस्पर विरोधी संस्करण / संस्करण रेंज निर्दिष्ट हो।
रीस

2
पैकेज स्थापित करने का एकमात्र तरीका होना चाहिए। जब तक आप अन्य योगदानकर्ताओं को भ्रमित नहीं करना चाहते, तब तक दोनों की अनुशंसा नहीं की जाती है।
ग्यूथेन

17

यहाँ मैं अपने setup.py में क्या रखा है:

# this grabs the requirements from requirements.txt
REQUIREMENTS = [i.strip() for i in open("requirements.txt").readlines()]

setup(
    .....
    install_requires=REQUIREMENTS
)

20
बाहर देखो, आवश्यकताओं फ़ाइलों में टिप्पणी और निष्कर्ष शामिल हो सकते हैं। आपको पाइप पार्सर का उपयोग करना चाहिए
रोमेन हार्डॉइन

1
हाँ, मैंने अंततः टिप्पणियों को अलग करने के लिए इसे बदल दिया। पाइप पार्सर मेरे जवाब से बेहतर लगता है।
आरबीपी

7
यदि सभी में पहले से ही सेटअपफ्रीडम है तो आवश्यकताओं की फाइल का उपयोग क्यों करें?
सेबेस्टियन ब्लास्क

2
@RomainHardouin, जैसा कि आपके लिंक किए गए जवाब में टिप्पणियों में बताया गया है, पाइप का मतलब उस तरह से इस्तेमाल नहीं किया जाना है।
एकैहोला

1
जब तक --extra-index-urlआवश्यकताओं में एक महत्वपूर्ण की आवश्यकता नहीं थी, तब तक यह मेरे लिए काम करता था और इसने मेरे चेहरे में विस्फोट कर दिया। धन्यवाद @RomainHardouin
टॉमी

11

पायथन पैकेजिंग यूजर गाइड में इस विषय के बारे में एक पृष्ठ है, मैं आपको इसे पढ़ने की अत्यधिक सलाह देता हूं:

सारांश:

install_requiresपैकेज की निर्भरता को सूचीबद्ध करने के लिए है कि पैकेज को काम करने के लिए बिल्कुल स्थापित किया जाना चाहिए। यह विशिष्ट संस्करणों के लिए निर्भरता को पिन करने के लिए नहीं है, लेकिन श्रेणियों को स्वीकार किया जाता है, उदाहरण के लिए install_requires=['django>=1.8']install_requiresद्वारा pip install name-on-pypiऔर अन्य उपकरणों का अवलोकन किया जाता है ।

requirements.txtकेवल एक पाठ फ़ाइल है, जिसके pip install -r requirements.txtविरुद्ध आप चुन सकते हैं । यह इस तरह से निर्भर सभी निर्भरता और उप-निर्भरता के संस्करणों का मतलब है django==1.8.1:। आप एक का उपयोग कर बना सकते हैं pip freeze > requirements.txt। (कुछ सेवाएँ, जैसे हरोकू, स्वचालित रूप pip install -r requirements.txtसे आपके लिए चलती हैं।) केवल पर pip install name-on-pypiनहीं देखती हैं ।requirements.txtinstall_requires


5

मैं केवल कभी ही उपयोग करता हूं setup.pyऔर install_requiresक्योंकि देखने के लिए केवल एक ही जगह है। यह आवश्यकताओं फ़ाइल के रूप में के रूप में शक्तिशाली है और बनाए रखने के लिए कोई दोहराव नहीं है।


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