संक्षिप्त उत्तर यह है कि requirements.txtकेवल पैकेज आवश्यकताओं को सूचीबद्ध करने के लिए है। setup.pyदूसरी ओर एक स्थापना स्क्रिप्ट की तरह अधिक है। यदि आप अजगर कोड को स्थापित करने की योजना नहीं बनाते हैं, तो आमतौर पर आपको केवल आवश्यकता होगीrequirements.txt ।
फ़ाइल का setup.pyवर्णन करता है, पैकेज निर्भरता के अलावा, फ़ाइलों और मॉड्यूल का सेट जिसे पैक किया जाना चाहिए (या मूल मॉड्यूल के मामले में संकलित किया जाता है (यानी, सी में लिखा है), और मेटाडेटा को अजगर पैकेज लिस्टिंग में जोड़ना होगा जैसे पैकेज का नाम, पैकेज संस्करण, पैकेज विवरण, लेखक, ...)।
क्योंकि दोनों फाइलें निर्भरता को सूचीबद्ध करती हैं, इससे कुछ दोहराव हो सकता है। जानकारी के लिए नीचे पढ़ें।
requirements.txt
यह फ़ाइल अजगर पैकेज आवश्यकताओं को सूचीबद्ध करती है। यह एक सादा पाठ फ़ाइल है (वैकल्पिक रूप से टिप्पणियों के साथ) जो आपके अजगर परियोजना (प्रति पंक्ति एक) की पैकेज निर्भरता को सूचीबद्ध करती है । यह आपके अजगर पैकेज स्थापित करने के तरीके का वर्णन नहीं करता है। आप आम तौर पर आवश्यकताओं फ़ाइल के साथ उपभोग करेंगेpip install -r requirements.txt ।
पाठ फ़ाइल का फ़ाइल नाम मनमाना है, लेकिन अक्सर requirements.txtसम्मेलन द्वारा होता है। अन्य पायथन पैकेजों के स्रोत कोड रिपोजिटरी की खोज करते समय, आप अन्य नामों पर ठोकर खा सकते हैं, जैसे कि dev-dependencies.txtया dependencies-dev.txt। वे एक ही उद्देश्य के रूप में सेवा करते हैं, dependencies.txtलेकिन आम तौर पर विशेष पैकेज के डेवलपर्स के लिए ब्याज की अतिरिक्त निर्भरता को सूचीबद्ध करते हैं, अर्थात् रिलीज से पहले स्रोत कोड (जैसे pytest, pylint, आदि) के परीक्षण के लिए। पैकेज के उपयोगकर्ताओं को आमतौर पर पैकेज चलाने के लिए डेवलपर निर्भरता के पूरे सेट की आवश्यकता नहीं होती है।
यदि कई requirements-X.txtवेरिएंट मौजूद हैं, तो आमतौर पर एक रनटाइम निर्भरता, और अन्य बिल्ड-टाइम या टेस्ट निर्भरता को सूचीबद्ध करेगा। कुछ परियोजनाएं अपनी आवश्यकताओं की फ़ाइल को भी कैस्केड करती हैं, अर्थात जब एक आवश्यकता फ़ाइल में दूसरी फ़ाइल ( उदाहरण ) शामिल होती है। ऐसा करने से पुनरावृत्ति को कम किया जा सकता है।
setup.py
यह एक पायथन स्क्रिप्ट है जो setuptoolsएक अजगर पैकेज (नाम, फाइलें शामिल, पैकेज मेटाडेटा, और इंस्टॉलेशन) को परिभाषित करने के लिए मॉड्यूल का उपयोग करता है । यह requirements.txtपैकेज की रनटाइम निर्भरता को भी सूचीबद्ध करेगा । सेटप्टोल्स अजगर पैकेज बनाने और स्थापित करने का एक वास्तविक तरीका है, लेकिन इसकी कमियां हैं, जिसने समय के साथ पाइप की तरह नए "मेटा-पैकेज मैनेजर" के विकास को अंकुरित किया है। एक ही पैकेज के कई संस्करणों को स्थापित करने के लिए सेटअपूल की उदाहरण कमियों, और एक स्थापना रद्द आदेश की कमी है।
जब एक अजगर उपयोगकर्ता करता है pip install ./pkgdir_my_module(या pip install my-module), setup.pyदी गई निर्देशिका (या मॉड्यूल) में पाइप चलेगा । इसी तरह, किसी भी मॉड्यूल को एक ही फ़ोल्डर से चलाकर, इंस्टाल setup.pyकिया जा सकता है pip, जैसे pip install .।
क्या मुझे वास्तव में दोनों की आवश्यकता है?
संक्षिप्त उत्तर नहीं है, लेकिन दोनों के लिए अच्छा है। वे विभिन्न उद्देश्यों को प्राप्त करते हैं, लेकिन इन दोनों का उपयोग आपकी निर्भरता को सूचीबद्ध करने के लिए किया जा सकता है।
वहाँ एक चाल आप के बीच निर्भरता की अपनी सूची को डुप्लिकेट से बचने के लिए विचार कर सकते हैं है requirements.txtऔर setup.py। यदि आपने setup.pyअपने पैकेज के लिए पहले से ही पूरी तरह से काम कर लिखा है , और आपकी निर्भरताएं ज्यादातर बाहरी हैं, तो आप requirements.txtकेवल निम्नलिखित के साथ एक साधारण विचार कर सकते हैं :
# requirements.txt
#
# installs dependencies from ./setup.py, and the package itself,
# in editable mode
-e .
# (the -e above is optional). you could also just install the package
# normally with just the line below (after uncommenting)
# .
-eएक विशेष है pip installविकल्प है, जिसमें दिए गए पैकेज को स्थापित करता है संपादन योग्य मोड। जब pip -r requirements.txtइस फ़ाइल पर चलाया जाता है, तो पाइप सूची के माध्यम से आपकी निर्भरता को स्थापित करेगा ./setup.py। संपादन योग्य विकल्प आपकी इंस्टॉल डायरेक्टरी (अंडे या आर्काइव्ड कॉपी के बजाय) में एक सिमलिंक लगाएगा। यह डेवलपर्स को पुन: स्थापित किए बिना रिपॉजिटरी से कोड को संपादित करने की अनुमति देता है।
जब आप अपने पैकेज रिपॉजिटरी में दोनों फाइल रखते हैं, तो आप "सेटप्टूल एक्स्ट्रा" भी कह सकते हैं। आप एक कस्टम श्रेणी के तहत setup.py में वैकल्पिक पैकेज को परिभाषित कर सकते हैं, और उन पैकेजों को पाइप के साथ बस उस श्रेणी से स्थापित कर सकते हैं:
# setup.py
from setuptools import setup
setup(
name="FOO"
...
extras_require = {
'dev': ['pylint'],
'build': ['requests']
}
...
)
और फिर, आवश्यकताओं फ़ाइल में:
# install packages in the [build] category, from setup.py
# (path/to/mypkg is the directory where setup.py is)
-e path/to/mypkg[build]
यह आपके सभी निर्भरता सूचियों को setup.py के अंदर रखेगा।
नोट : आप आम तौर पर सैंडबॉक्स से पाइप और setup.py को निष्पादित करेंगे, जैसे कि प्रोग्राम के साथ बनाए गए virtualenv। यह आपकी परियोजना के विकास के वातावरण के संदर्भ में अजगर पैकेज स्थापित करने से बचाएगा।