पायथन वास्तव में बुद्धिमानी से सेट करने के लिए कड़ी मेहनत करता है sys.path। यह कैसे सेट किया जाता है, वास्तव में जटिल हो सकता है । निम्नलिखित गाइड एक पानी पिलाया-नीचे, कुछ हद तक अधूरा, कुछ हद तक गलत है, लेकिन उम्मीद है कि उपयोगी क्या होता है अजगर आंकड़े क्या के रूप में उपयोग करने के लिए बाहर जब से पद और फ़ाइल अजगर प्रोग्रामर के लिए गाइड है प्रारंभिक मान का sys.path,
sys.executable, sys.exec_prefix, और sys.prefixएक सामान्य
अजगर स्थापना पर।
सबसे पहले, पायथन अपने स्तर पर सबसे अच्छा करता है कि ऑपरेटिंग सिस्टम इसे क्या बताता है, उसके आधार पर फाइल सिस्टम पर अपने वास्तविक भौतिक स्थान का पता लगाने के लिए। अगर OS सिर्फ "अजगर" कह रहा है, तो वह खुद को $ PATH में पाता है। यह किसी भी प्रतीकात्मक लिंक को हल करता है। एक बार जब यह ऐसा हो जाता है, तो निष्पादन योग्य पथ जो इसे खोजता है, का उपयोग मान के रूप में किया जाता है sys.executable, यदि नहीं, तो और, या नहीं।
अगला, यह sys.exec_prefixऔर के
लिए प्रारंभिक मान निर्धारित करता है sys.prefix।
यदि pyvenv.cfgएक निर्देशिका के रूप में sys.executableया एक निर्देशिका अप में एक फ़ाइल कहा जाता है
, तो अजगर इसे देखता है। अलग-अलग OS इस फाइल के साथ अलग-अलग काम करते हैं।
इस कॉन्फ़िग फ़ाइल में एक मान है कि अजगर जो दिखता है वह कॉन्फ़िगरेशन विकल्प है home = <DIRECTORY>। पायथन इस निर्देशिका का उपयोग निर्देशिका के बजाय करेगा sys.executable
जब यह गतिशील रूप से sys.prefixबाद के प्रारंभिक मूल्य को निर्धारित करेगा । यदि applocal = trueसेटिंग pyvenv.cfgविंडोज पर फ़ाइल में दिखाई देती है
, लेकिन home = <DIRECTORY>सेटिंग नहीं है , तो sys.prefixनिर्देशिका में सेट हो जाएगी sys.executable।
इसके बाद, PYTHONHOMEपर्यावरण चर की जांच की जाती है। लिनक्स और मैक पर,
sys.prefixऔर यदि यह मौजूद है, तो पर्यावरण चर पर sys.exec_prefixसेट कर दिया PYTHONHOMEजाता है, किसी भी सेटिंग को सुपरसेडिंगhome = <DIRECTORY> कर सकते हैं pyvenv.cfg। विंडोज पर,
sys.prefixऔर पर्यावरण चर पर sys.exec_prefixसेट है PYTHONHOME, अगर यह मौजूद है, जब तक कि कोई home = <DIRECTORY>सेटिंग मौजूद नहीं है pyvenv.cfg, जो इसके बजाय उपयोग किया जाता है।
अन्यथा, इन sys.prefixऔर sys.exec_prefixके स्थान से पैदल पीछे की ओर से पाए जाते हैं sys.executable, या homeनिर्देशिका द्वारा दिए गए pyvenv.cfgयदि कोई हो।
यदि फ़ाइल lib/python<version>/dyn-loadउस निर्देशिका या उसके किसी भी मूल निर्देशिका में पाई जाती है, तो वह निर्देशिका sys.exec_prefixलिनक्स या मैक पर होना तय है
। यदि फ़ाइल
lib/python<version>/os.pyनिर्देशिका या इसके किसी भी उपनिर्देशिका में पाई जाती है, तो वह निर्देशिका sys.prefixलिनक्स, मैक और विंडोज पर sys.exec_prefixसेट की जाती है , जिसमें sys.prefixविंडोज पर समान मूल्य निर्धारित होता है
। यदि applocal = trueसेट किया गया है तो यह संपूर्ण चरण विंडोज पर छोड़ दिया
जाता है। या तो की निर्देशिका का sys.executableउपयोग किया जाता है, या यदि homeसेट किया जाता है, तो pyvenv.cfgइसका उपयोग प्रारंभिक मूल्य के लिए किया जाता है sys.prefix।
यदि यह इन "लैंडमार्क" फ़ाइलों को नहीं खोज सकता है या sys.prefixअभी तक नहीं मिला है, तो अजगर sys.prefixएक "फॉलबैक" मूल्य पर सेट होता है। उदाहरण के लिए, लिनक्स और मैक, पूर्व संकलित चूक का उपयोग करते हैं sys.prefixऔर sys.exec_prefix। विंडोज तब तक इंतजार करता है जब तक sys.pathकि उसके लिए एक फॉलबैक मूल्य निर्धारित करने के लिए पूरी तरह से तैयार नहीं हो जाता है
sys.prefix।
फिर, (जो आप सभी की प्रतीक्षा कर रहे हैं) अजगर उन प्रारंभिक मूल्यों को निर्धारित करता है जो इसमें निहित हैं sys.path।
- जो स्क्रिप्ट अजगर निष्पादित कर रहा है, उसकी निर्देशिका इसमें जोड़ी गई है
sys.path। विंडोज पर, यह हमेशा खाली स्ट्रिंग होता है, जो अजगर को पूर्ण पथ का उपयोग करने के लिए कहता है जहां स्क्रिप्ट स्थित है।
- PYTHONPATH पर्यावरण चर की सामग्री, यदि सेट की गई है, तो इसमें जोड़ा जाता है
sys.path, जब तक कि आप विंडोज पर नहीं हैं और applocalवास्तविक में सेट नहीं हैं pyvenv.cfg।
- ज़िप फ़ाइल पथ, जो
<prefix>/lib/python35.zipलिनक्स / मैक और
os.path.join(os.dirname(sys.executable), "python.zip")विंडोज पर है, को जोड़ा जाता है sys.path।
- यदि विंडोज पर और कोई
applocal = trueसेट नहीं किया गया था pyvenv.cfg, तो रजिस्ट्री कुंजी के उपकुंजियों की सामग्री
HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\को जोड़ दिया जाता है, यदि कोई हो।
- यदि विंडोज पर और कोई
applocal = trueसेट नहीं किया गया था pyvenv.cfg, और sys.prefixनहीं पाया जा सकता है, तो रजिस्ट्री कुंजी की मूल सामग्रीHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ को जोड़ा जाता है, अगर यह मौजूद है;
- यदि विंडोज पर और कोई
applocal = trueसेट नहीं किया गया था pyvenv.cfg, तो रजिस्ट्री कुंजी के उपकुंजियों की सामग्री
HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\को जोड़ दिया जाता है, यदि कोई हो।
- यदि विंडोज पर और कोई
applocal = trueसेट नहीं किया गया था pyvenv.cfg, और sys.prefixनहीं पाया जा सकता है, तो रजिस्ट्री कुंजी की मूल सामग्रीHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ को जोड़ा जाता है, अगर यह मौजूद है;
- यदि विंडोज पर, और PYTHONPATH सेट नहीं किया गया था, तो उपसर्ग नहीं मिला था, और कोई रजिस्ट्री कुंजी मौजूद नहीं थी, तो PYTHONPATH का सापेक्ष संकलन-समय मूल्य जोड़ा जाता है; अन्यथा, इस चरण को अनदेखा कर दिया जाता है।
- संकलित मैक्रो PYTHONPATH में पथ गतिशील रूप से पाए जाने के सापेक्ष जोड़े जाते हैं
sys.prefix।
- Mac और Linux पर, का मान
sys.exec_prefixजोड़ा जाता है। विंडोज पर, जिस निर्देशिका का उपयोग किया गया था (या इस्तेमाल किया गया होगा) को गतिशील रूप से खोजने के लिए sys.prefixजोड़ा जाता है।
विंडोज पर इस स्तर पर, यदि कोई उपसर्ग नहीं मिला था, तो अजगर लैंडमार्क फ़ाइलों के लिए सभी निर्देशिकाओं को खोजकर इसे निर्धारित करने का प्रयास करेगा sys.path, क्योंकि यह sys.executableपहले की निर्देशिका के साथ करने की कोशिश करता था, जब तक कि यह कुछ नहीं पाता। यदि ऐसा नहीं होता है, sys.prefixतो खाली छोड़ दिया जाता है।
अंत में, इस सब के बाद, पायथन ने siteमॉड्यूल को लोड किया , जो आगे अभी तक सामान जोड़ता है sys.path:
यह एक सिर और एक पूंछ भाग से चार निर्देशिकाओं का निर्माण करके शुरू होता है। सिर के हिस्से के लिए, यह उपयोग करता है sys.prefixऔर sys.exec_prefix; खाली सिर छोड़े जाते हैं। टेल भाग के लिए, यह खाली स्ट्रिंग और फिर lib/site-packages(विंडोज पर) या lib/pythonX.Y/site-packages
फिर lib/site-python(यूनिक्स और मैकिंटोश पर) का उपयोग करता है। प्रत्येक विशिष्ट हेड-टेल संयोजनों के लिए, यह देखता है कि क्या यह किसी मौजूदा निर्देशिका को संदर्भित करता है, और यदि ऐसा है, तो इसे sys.path में जोड़ता है और कॉन्फ़िगरेशन फ़ाइलों के लिए नए जोड़े गए पथ का भी निरीक्षण करता है।