setuptools बनाम distutils: क्यों distutils अभी भी एक बात है?


143

अजगर उपकरण है कि पैकेज और परियोजनाओं का विवरण देने में इस्तेमाल किया जा सकता का एक भ्रामक इतिहास रहा है: इन में शामिल distutilsस्टैंडर्ड लाइब्रेरी में, distribute, distutils2, और setuptools(और शायद अधिक)। ऐसा प्रतीत होता है कि distributeऔर distutils2इसके पक्ष में बंद कर दिया गया था setuptools, जो दो प्रतिस्पर्धी मानकों को छोड़ देता है।

मेरी समझ से setuptoolsकहीं अधिक विकल्प (जैसे निर्भरता, परीक्षण, आदि की घोषणा करना) प्रदान करता है distutils, हालांकि यह पायथन मानक पुस्तकालय (अभी तक?) में शामिल नहीं है।

अजगर पैकेजिंग उपयोगकर्ता गाइड [ 1 ] अब सिफारिश की गई है:

setuptoolsपरियोजनाओं को परिभाषित करने और स्रोत वितरण बनाने के लिए उपयोग करें ।

और बताते हैं:

यद्यपि आप distutilsकई परियोजनाओं के लिए शुद्ध उपयोग कर सकते हैं , लेकिन यह अन्य परियोजनाओं पर निर्भरता को परिभाषित करने का समर्थन नहीं करता है और पैकेज मेटाडाटा को सही ढंग से पॉपुलेट करने के लिए कई सुविधा उपयोगिताओं को याद कर रहा है जो इसके द्वारा प्रदान किए गए हैं setuptools। मानक पुस्तकालय के बाहर होने के कारण, सेटपूल भी पायथन के विभिन्न संस्करणों में एक अधिक सुसंगत विशेषता प्रदान करता है, और (इसके विपरीत distutils), setuptoolsसभी समर्थित संस्करणों पर आगामी "मेटाडेटा 2.0" मानक प्रारूपों का उत्पादन करने के लिए अद्यतन किया जाएगा।

यहां तक ​​कि उन परियोजनाओं के लिए भी जो उपयोग करने का चयन करते हैं distutils, जब पाइप ऐसी परियोजनाओं को सीधे स्रोत से स्थापित करता है (बजाय एक प्रीबिल्ट व्हील फ़ाइल से स्थापित करने के लिए), यह वास्तव में setuptoolsइसके बजाय का उपयोग करके आपकी परियोजना का निर्माण करेगा ।

हालाँकि, विभिन्न प्रोजेक्ट की सेटअपफ़ॉर्म फ़ाइलों में देखने से पता चलता है कि यह वास्तविक मानक नहीं है। कई पैकेज अभी भी उपयोग करते हैं distutilsऔर जो समर्थन करते हैं वे setuptoolsअक्सर एक उदाहरण के setuptoolsसाथ मिश्रण करते distutilsहैं एक वापसी आयात करके:

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

सेटअप लिखने का एक तरीका खोजने के प्रयास के बाद, जिसे दोनों द्वारा स्थापित किया जा सकता है setuptoolsऔर distutils। इसमें अक्सर त्रुटि-प्रवण निर्भरता जाँच के विभिन्न तरीके शामिल होते हैं, क्योंकि distutilsसेटअप फ़ंक्शन में निर्भरता का समर्थन नहीं करता है।

लोग अभी भी समर्थन करने के लिए अतिरिक्त प्रयास क्यों कर रहे हैं distutils- क्या तथ्य यह setuptoolsहै कि मानक पुस्तकालय में एकमात्र कारण नहीं है? इसके क्या फायदे हैं distutilsऔर क्या कोई सेटअप सेटअप फ़ाइल लिखने में कमियां हैं जो केवल समर्थन करती हैं setuptools


4
distutilsको वापस मर्ज कर दिया गया हैsetuptools , लेकिन ऐसी विरासत ऐप हैं जिनका उपयोग करने के लिए लिखा गया था distutilsऔर सही मानकों पर माइग्रेट करने के लिए शामिल लागतें हैं।
मेटास्टैस्टर

3
"ऐसा लगता है कि वितरित करने और distutils2 setuptools के पक्ष में बंद कर दिया गया", सही, वितरित अब केवल setuptools के लिए एक आवरण है, और distutils2 मर चुका है।
- एसई बुराई है

1
setuptoolsएक बढ़ा हुआ विकल्प है, distutilsलेकिन ध्यान दें कि " अनुशंसित पाइप इंस्टॉलर सभी setup.py स्क्रिप्ट के साथ चलता है setuptools, भले ही स्क्रिप्ट केवल आयात करता होdistutils " ( स्रोत )
user2314737

जवाबों:


77

इस एसओ प्रश्न पर एक नजर है। यह सभी पैकेजिंग विधियों को बहुत अच्छी तरह से समझाता है, और कुछ हद तक आपके प्रश्न का उत्तर देने में मदद कर सकता है: वितरण, डिस्टुटिल, सेटप्टूल और डिस्टुटिल्स 2 के बीच अंतर?

व्याकुलता अभी भी पायथन में पैकेजिंग के लिए मानक उपकरण है। यह मानक पुस्तकालय (पायथन 2 और पायथन 3.0 से 3.3) में शामिल है। यह साधारण पायथन वितरण के लिए उपयोगी है, लेकिन इसमें सुविधाओं की कमी है। यह उन पायथन पैकेज का परिचय देता है, जिन्हें आपके setup.py स्क्रिप्ट में आयात किया जा सकता है।

डिस्टिल्स की सीमाओं को दूर करने के लिए सेटप्टूल विकसित किए गए थे, और यह मानक पुस्तकालय में शामिल नहीं है। इसने एक कमांड-लाइन उपयोगिता पेश की जिसे easy_install कहा जाता है। इसने setuptools Python पैकेज भी पेश किया, जिसे आपके setup.py स्क्रिप्ट में आयात किया जा सकता है, और pkg_resources पायथन पैकेज जिसे वितरण के साथ स्थापित डेटा फ़ाइलों का पता लगाने के लिए आपके कोड में आयात किया जा सकता है। इसके गोचरों में से एक यह है कि यह बंदर को विचलित करता है अजगर पैकेज। इसे पाइप के साथ अच्छी तरह से काम करना चाहिए। नवीनतम संस्करण जुलाई 2013 में जारी किया गया था।

इसलिए, जैसा कि आप देख सकते हैं कि सेटप्टूल को डिस्टिलिट्स के लिए प्राथमिकता दी जानी चाहिए, और मैं देख रहा हूं कि आपका प्रश्न कहां से आता है, हालांकि मुझे डिस्टिलिट्स को कभी भी समर्थन खोते हुए नहीं दिखता है, जैसा कि, बस, इसे कई मामलों में कुछ लोकप्रिय विरासत कार्यक्रमों के साथ प्रयोग किया जाता है। । और जैसा कि आप शायद जानते हैं कि विरासत कार्यक्रमों में इस तरह की चीजों को बदलना काफी दर्द हो सकता है और उदाहरण के लिए असंगति के लिए काफी कुछ समस्याएं आती हैं, जो तब डेवलपर को स्रोत कोड को फिर से लिखना होगा। तो वहाँ है, और यह भी तथ्य यह है कि distutils मानक अजगर पुस्तकालय का एक हिस्सा है, जबकि setuptools नहीं है। इसलिए, यदि आप एक अजगर कार्यक्रम बना रहे हैं, तो इस दिन और उम्र में, सेटप्टूल का उपयोग करें, हालांकि ध्यान रखें कि डिस्टिल के बिना, सेटप्टूल का अस्तित्व कभी नहीं होता।


3
"व्याकुलता अभी भी पायथन में पैकेजिंग के लिए मानक उपकरण है।" पायथन पैकेजिंग उपयोगकर्ता गाइड के विरोधाभासी।
cel

1
मैं ऐसा नहीं मानता, क्या यह स्पष्ट रूप से कहा जाता है कि सेटटॉपल्स मानक है। यह भी ध्यान दें कि, उस वाक्यांश को मेरे द्वारा प्रदान की गई वेबसाइट से उद्धृत किया गया था, इसलिए, वे मेरे शब्द नहीं हैं। हालांकि यह एक राय है जो मैं, कई अन्य लोगों से सहमत हूं।

मैंने आपको इस पुरस्कार से सम्मानित किया क्योंकि समुदाय आपसे सहमत है। दुर्भाग्य से इस सवाल पर उतना ध्यान नहीं गया जितना कि मैं चाहूंगा कि यह मिल जाएगा।
cel

easy_install मुख्य कारण है जो मैंने सेप्टुपूल को अस्वीकार कर दिया है - यह मेरे लिए पैकेज में समस्याओं का एक बड़ा स्रोत रहा है जो इसका उपयोग करते हैं (केवल पुनरावृत्ति के लिए आसान)। अन्य विशेषताएं ठीक हैं।
स्टुअर्ट गैथमैन

14

तथ्य यह है कि setuptools मानक पुस्तकालय में ही कारण नहीं है

यही एक कारण है। निम्नलिखित NumPysetup.py से सीधा है :

if len(sys.argv) >= 2 and ('--help' in sys.argv[1:] or
        sys.argv[1] in ('--help-commands', 'egg_info', '--version',
                        'clean')):
    # Use setuptools for these commands (they don't work well or at all
    # with distutils).  For normal builds use distutils.
    try:
        from setuptools import setup
    except ImportError:
        from distutils.core import setup

setuptoolsअगर यह मिल सकता है तो NumPy पसंद करता है। लेकिन तब SciPy ऐसा करता था, जब तक कि उसे कुछ स्थितियों में पसंद करने के लिए पैच नहीं किया जाता था distutils। कमिट लॉग का हवाला देते हुए:

Setuptools sets mode +x on the test scripts, so that Nose refuses to run
them. Better not do that.

बेशक, इस समय के बीच विलयsetuptools और distributeयह सब कुछ हल करना चाहिए, लेकिन कई पैकेजों को अभी भी पायथन 2.6 प्रतिष्ठानों का समर्थन करने की आवश्यकता है।


1
distributeका एक कांटा था setuptoolsऔर अब वापस विलय कर दिया गया है।
R4444

10

ऐसे कई कारण हैं जिनके बारे में हम अभी भी बात करते हैं और डिस्टिलिट्स का उपयोग करते हैं, भले ही सेटपूलट एक संदेह के बिना बेहतर उपकरण सेट है।

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

दूसरी बात, सेटपूल, डिस्टल्यूट को एन्हांसमेंट प्रदान करता है। यह इसलिए distutils उपकरण सेट के बाद मॉडलिंग की है और यह वहाँ से संरचना के सभी लेता है। सेटप्टूल के लिए प्रलेखन पाठक मानता है कि डिस्टिल्स से परिचित है और केवल दस्तावेज है कि यह आधार टूल सेट को कैसे बढ़ाता है। आप यह सोच सकते हैं कि डिस्टिल्स बोली को परिभाषित करता है और सेटटॉपल्स उस बोली को बढ़ाता है।

नई परियोजनाओं के लिए मेरा व्यक्तिगत दृष्टिकोण इस धारणा से शुरू होता है कि मैं डिस्टिल का उपयोग करने जा रहा हूं। केवल इस परियोजना के बढ़ने के बाद सेट अप की एक विशेषता की आवश्यकता होती है जो मैं अपग्रेड करता हूं। सेटटूपल्स डिस्टुटिल्स के लिए एक ड्रॉप-इन-रिप्लेसमेंट है, यह मेरे setup.py के लिए एक-लाइन परिवर्तन है।


आपके उत्तर के लिए धन्यवाद। मुझे लगता है कि उपलब्धता तर्क उतना महत्वपूर्ण नहीं हो सकता है, क्योंकि सेटप्टूल की स्थापना बूटस्ट्रैप की जा सकती है। मैं देखता हूं कि अगर डिस्टुटिल पर्याप्त कार्यशीलता प्रदान करता है - इसका उपयोग करने का कोई मतलब नहीं है। लेकिन मेरी राय में डिस्टुटिल्स और सेटप्टूल को मिलाना किसी के लक्ष्यों को हासिल करने का बहुत साफ तरीका नहीं है। हालांकि, @larsmans ने अपने जवाब में सेटप्टूल के साथ कुछ कठिनाइयों को दिखाया जो कुछ कार्यों के लिए डिस्टिल्स का उपयोग करने के लिए मजबूर करते हैं।
cel

9

मूलतः, यह जिम्मेदारियों के विभाजन के कारण है।

setuptoolsपायथन मानक पुस्तकालय का हिस्सा नहीं है क्योंकि यह पायथन कोर टीम के बजाय एक 3 पार्टी द्वारा बनाए रखा गया है। जिसका अर्थ है, अन्य बातों के अलावा:

  • यह कोर टेस्ट सूट द्वारा कवर नहीं किया गया है और कोर कार्यक्षमता द्वारा भरोसा नहीं किया है
  • यह स्वयं ऐड-ऑन मॉड्यूल (उनके स्थान, आयात के साधन, सी एक्सटेंशन 'बाइनरी इंटरफ़ेस आदि) के लिए मुख्य मानक निर्धारित नहीं करता है ।
  • इसे पाइथन रिलीज़ से स्वतंत्र रूप से अपडेट और रिलीज़ किया गया है

प्रभावी रूप से, कोर टीम ने सभी सामानों ( उस विस्तारित कंपाइलर / पैकेज प्रारूप / जो भी समर्थन) से परे 3 पार्टियों को छोड़ते हुए , अपने लिए "मुख्य मानकों" और "न्यूनतम आवश्यक संकलन" भागों को छोड़कर , डिस्टिल के दायरे को कम कर दिया है। कोड जो पहले उन "विस्तारित भागों" को कवर कर रहा था , पीछे की संगतता के लिए बासी छोड़ दिया गया था

पायथन मॉड्यूल से वितरण - पायथन 2.7.12 प्रलेखन :

जबकि प्रत्यक्ष उपयोग को distutilsसमाप्त किया जा रहा है, फिर भी इसने मौजूदा पैकेजिंग और वितरण बुनियादी ढांचे की नींव रखी, और यह न केवल मानक पुस्तकालय का हिस्सा बना हुआ है, बल्कि इसका नाम अन्य तरीकों से भी रहता है (जैसे मेलिंग सूची का नाम) पायथन पैकेजिंग मानकों के विकास के समन्वय के लिए उपयोग किया जाता है)।

अन्य OSes के पैकेज इसी तरह setuptoolsऔर pipअलग-अलग कारणों से प्रदान किए जाने की संभावना है

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