पायथन वास्तव में बुद्धिमानी से सेट करने के लिए कड़ी मेहनत करता है 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 में जोड़ता है और कॉन्फ़िगरेशन फ़ाइलों के लिए नए जोड़े गए पथ का भी निरीक्षण करता है।