python - setuptools बनाम distutils: distutils अभी भी एक चीज क्यों है?
packaging (3)
यह तथ्य है कि setuptools मानक पुस्तकालय में एकमात्र कारण नहीं है
यही एक कारण है। निम्नलिखित NumPy setup.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
तो NumPy setuptools
पसंद setuptools
अगर यह इसे मिल सकता है। लेकिन तब SciPy ऐसा करने के लिए प्रयोग किया जाता था, जब तक कि कुछ स्थितियों में distutils
पसंद करने के लिए patched किया गया था। प्रतिबद्ध लॉग का हवाला देते हुए:
Setuptools sets mode +x on the test scripts, so that Nose refuses to run
them. Better not do that.
बेशक, setuptools
और distribute
बीच एक विलय उचित समय में यह सब हल करना चाहिए, लेकिन कई संकुल अभी भी Python 2.6 प्रतिष्ठानों का समर्थन करने की आवश्यकता है।
पायथन के पास टूल्स का एक भ्रमित इतिहास है जिसका उपयोग परियोजनाओं को पैकेज और वर्णन करने के लिए किया जा सकता है: इनमें मानक लाइब्रेरी, distribute
, setuptools
, और setuptools
(और शायद अधिक) में setuptools
। ऐसा प्रतीत होता है कि distribute
और setuptools
पक्ष में बंद कर दिया गया था, जो दो प्रतिस्पर्धी मानकों को छोड़ देता है।
मेरी समझ के लिए setuptools
की setuptools
में कहीं अधिक विकल्प प्रदान करता है (उदाहरण के लिए निर्भरता, परीक्षण इत्यादि), हालांकि यह पायथन मानक पुस्तकालय (अभी तक?) में शामिल नहीं है।
पायथन पैकेजिंग उपयोगकर्ता मार्गदर्शिका [ 1 ] अब सिफारिश करती है:
परियोजनाओं को परिभाषित करने और स्रोत वितरण बनाने के लिए
setuptools
का उपयोग करें।
और बताता है:
यद्यपि आप कई परियोजनाओं के लिए शुद्ध
distutils
उपयोग कर सकते हैं, यह अन्य परियोजनाओं पर निर्भरता परिभाषित करने का समर्थन नहीं करता है औरsetuptools
द्वारा प्रदान किए गए पैकेज मेटाडेटा को स्वचालित रूप से पॉप्युलेट करने के लिए कई सुविधा उपयोगिताओं को याद कर रहा है। मानक पुस्तकालय के बाहर होने के नाते, setuptools भी पाइथन के विभिन्न संस्करणों में एक और अधिक सुसंगत सुविधा सेट प्रदान करता है, और (setuptools
विपरीत),setuptools
को सभी समर्थित संस्करणों पर आने वाले "मेटाडेटा 2.0" मानक स्वरूपों का उत्पादन करने के लिए अपडेट किया जाएगा।यहां तक कि उन परियोजनाओं के लिए जो
distutils
का उपयोग करना चुनते हैं, जब पीपी ऐसी परियोजनाओं को सीधे स्रोत से स्थापित करता है (setuptools
व्हील फ़ाइल से स्थापित करने के बजाए), यह वास्तव में इसके बजायsetuptools
का उपयोग करके आपकी परियोजना का निर्माण करेगा।
हालांकि, विभिन्न प्रोजेक्ट की setup.py फाइलों को देखते हुए पता चलता है कि यह वास्तविक मानक प्रतीत नहीं होता है। कई पैकेज अभी भी setuptools
उपयोग करते हैं और जो setuptools
समर्थन setuptools
अक्सर setuptools
साथ setuptools
मिश्रण मिश्रण जैसे फॉलबैक आयात करके:
try:
from setuptools import setup
except ImportError:
from distutils.core import setup
एक सेटअप लिखने का एक तरीका खोजने के प्रयास द्वारा पीछा किया गया जो सेटअप setuptools
और setuptools
दोनों द्वारा स्थापित किया जा सकता है। इसमें अक्सर त्रुटि-प्रवण निर्भरता जांच के विभिन्न तरीकों को शामिल किया जाता है, क्योंकि distutils
सेटअप फ़ंक्शन में निर्भरताओं का समर्थन नहीं करता है।
लोग अभी भी setuptools
का समर्थन करने के लिए अतिरिक्त प्रयास क्यों कर रहे हैं - यह तथ्य है कि setuptools
मानक पुस्तकालय में एकमात्र कारण नहीं है? setuptools
के फायदे क्या हैं और setup.py फ़ाइलों को लिखने में कोई कमी है जो केवल setuptools
समर्थन setuptools
।
कई कारण हैं जिनके बारे में हम अभी भी बात करते हैं और आसवन का उपयोग करते हैं, भले ही सेटअपटॉल्स बिना किसी संदेह के बेहतर टूल सेट हैं।
सबसे पहले, distutils हर जगह उपलब्ध है। यदि आप दूसरों के साथ साझा करने के लिए मॉड्यूल बनाना चाहते हैं, और इसमें कोई जटिल आवश्यकता नहीं है, तो यह आपकी कार्य मशीन पर उपलब्ध होने की गारंटी है। यह विशेष रूप से महत्वपूर्ण है यदि आपको अजगर के पुराने संस्करणों का समर्थन करना है, या यदि आप स्वयं को अपरिचित वातावरण में काम करते हैं।
दूसरा, setuptools distutils में वृद्धि प्रदान करता है। इसलिए यह distutils उपकरण सेट के बाद मॉडलिंग किया जाता है और वहां से इसकी सारी संरचना लेता है। Setuptools के लिए प्रलेखन मानता है कि पाठक distutils से परिचित है और केवल दस्तावेज यह कैसे आधार उपकरण सेट को बढ़ाता है। आप इसके बारे में सोच सकते हैं कि distutils बोली को परिभाषित करता है और setuptools उस बोली को बढ़ाता है।
नई परियोजनाओं के लिए मेरा व्यक्तिगत दृष्टिकोण इस धारणा से शुरू होता है कि मैं distutils का उपयोग करने जा रहा हूँ। जैसे ही प्रोजेक्ट सेटअप की सुविधाओं की आवश्यकता के लिए बढ़ता है, मैं अपग्रेड करता हूं। Setuptools distutils के लिए एक ड्रॉप-इन-प्रतिस्थापन है, यह मेरे setup.py में एक-पंक्ति परिवर्तन है।
असल में, यह जिम्मेदारियों के विभाजन के कारण है।
setuptools
पायथन मानक पुस्तकालय का हिस्सा नहीं है क्योंकि यह पायथन कोर टीम की बजाय किसी तीसरे पक्ष द्वारा बनाए रखा जाता है। जिसका अर्थ है, अन्य चीजों के साथ:
- यह कोर टेस्ट सूट द्वारा कवर नहीं है और कोर कार्यक्षमता पर निर्भर नहीं है
- यह स्वयं एड-ऑन मॉड्यूल के लिए कोर मानकों को सेट नहीं करता है (उनका स्थान, आयात का साधन, सी एक्सटेंशन 'बाइनरी इंटरफ़ेस इत्यादि)।
- यह पाइथन रिलीज से स्वतंत्र रूप से अद्यतन और जारी किया गया है
प्रभावी रूप से, कोर टीम ने तीसरे पक्षों को उस (सभी विस्तारित कंपाइलर / पैकेज प्रारूप / जो भी समर्थन) से परे सभी सामान छोड़ते समय "मूल मानकों" और "न्यूनतम आवश्यक संकलन" भागों को सुरक्षित रखने के लिए आसवन के दायरे को कम कर दिया है। कोड जो पहले उन "विस्तारित हिस्सों" को कवर कर रहा था , पीछे की संगतता के लिए बाएं छोड़ दिया गया था ।
वितरित पायथन मॉड्यूल से - पायथन 2.7.12 प्रलेखन :
जबकि
distutils
प्रत्यक्ष उपयोग चरणबद्ध किया जा रहा है, यह अभी भी वर्तमान पैकेजिंग और वितरण बुनियादी ढांचे के लिए नींव रखी है, और यह न केवल मानक पुस्तकालय का हिस्सा बना हुआ है, लेकिन इसका नाम अन्य तरीकों से रहता है (जैसे मेलिंग का नाम पाइथन पैकेजिंग मानकों के विकास को समन्वयित करने के लिए उपयोग की जाने वाली सूची)।
उपरोक्त कारणों से अन्य ओएस के लिए पैकेज भी setuptools
और pip
अलग-अलग प्रदान करने की संभावना है
- और क्योंकि वे जरूरी नहीं हैं - या रखरखाव के लिए भी हानिकारक हैं - जब सिस्टम पर पहले से ही एक और पैकेज प्रबंधक है।