पायथन के sys.path को कहां से आरंभ किया गया है?


111

पायथन के sys.path को कहां से आरंभ किया गया है?

UPD : PYTHONPATH को संदर्भित करने से पहले अजगर कुछ रास्ते जोड़ रहा है:

    >>> import sys
    >>> from pprint import pprint as p
    >>> p(sys.path)
    ['',
     'C:\\Python25\\lib\\site-packages\\setuptools-0.6c9-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\orbited-0.7.8-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\morbid-0.8.6.1-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\demjson-1.4-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\stomper-0.2.2-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\uuid-1.30-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\stompservice-0.1.0-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\cherrypy-3.0.1-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\pyorbited-0.2.2-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\flup-1.0.1-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\wsgilog-0.1-py2.5.egg',
     'c:\\testdir',
     'C:\\Windows\\system32\\python25.zip',
     'C:\\Python25\\DLLs',
     'C:\\Python25\\lib',
     'C:\\Python25\\lib\\plat-win',
     'C:\\Python25\\lib\\lib-tk',
     'C:\\Python25',
     'C:\\Python25\\lib\\site-packages',
     'C:\\Python25\\lib\\site-packages\\PIL',
     'C:\\Python25\\lib\\site-packages\\win32',
     'C:\\Python25\\lib\\site-packages\\win32\\lib',
     'C:\\Python25\\lib\\site-packages\\Pythonwin']

मेरा PYTHONPATH है:

    PYTHONPATH=c:\testdir

मुझे आश्चर्य है कि PYTHONPATH के आने से पहले वे रास्ते कहां से आए?

जवाबों:


49

"पर्यावरण चर PYTHONPATH से आरंभ किया गया, साथ ही एक अधिष्ठापन-निर्भर डिफ़ॉल्ट"

- http://docs.python.org/library/sys.html#sys.path


7
मुझे लगता है कि वे साइट मॉड्यूल से आते हैं: docs.python.org/library/site.html
14:22

20
साइट मॉड्यूल आपके साइट-संकुल निर्देशिका में किसी भी .pth फ़ाइलों की सामग्री को लोड और पार्स करता है। ये .pth फ़ाइलें आपके PYTHONPATH में योग को शामिल
पूछना

77

पायथन वास्तव में बुद्धिमानी से सेट करने के लिए कड़ी मेहनत करता है 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

  1. जो स्क्रिप्ट अजगर निष्पादित कर रहा है, उसकी निर्देशिका इसमें जोड़ी गई है sys.path। विंडोज पर, यह हमेशा खाली स्ट्रिंग होता है, जो अजगर को पूर्ण पथ का उपयोग करने के लिए कहता है जहां स्क्रिप्ट स्थित है।
  2. PYTHONPATH पर्यावरण चर की सामग्री, यदि सेट की गई है, तो इसमें जोड़ा जाता है sys.path, जब तक कि आप विंडोज पर नहीं हैं और applocalवास्तविक में सेट नहीं हैं pyvenv.cfg
  3. ज़िप फ़ाइल पथ, जो <prefix>/lib/python35.zipलिनक्स / मैक और os.path.join(os.dirname(sys.executable), "python.zip")विंडोज पर है, को जोड़ा जाता है sys.path
  4. यदि विंडोज पर और कोई applocal = trueसेट नहीं किया गया था pyvenv.cfg, तो रजिस्ट्री कुंजी के उपकुंजियों की सामग्री HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\को जोड़ दिया जाता है, यदि कोई हो।
  5. यदि विंडोज पर और कोई applocal = trueसेट नहीं किया गया था pyvenv.cfg, और sys.prefixनहीं पाया जा सकता है, तो रजिस्ट्री कुंजी की मूल सामग्रीHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ को जोड़ा जाता है, अगर यह मौजूद है;
  6. यदि विंडोज पर और कोई applocal = trueसेट नहीं किया गया था pyvenv.cfg, तो रजिस्ट्री कुंजी के उपकुंजियों की सामग्री HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\को जोड़ दिया जाता है, यदि कोई हो।
  7. यदि विंडोज पर और कोई applocal = trueसेट नहीं किया गया था pyvenv.cfg, और sys.prefixनहीं पाया जा सकता है, तो रजिस्ट्री कुंजी की मूल सामग्रीHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ को जोड़ा जाता है, अगर यह मौजूद है;
  8. यदि विंडोज पर, और PYTHONPATH सेट नहीं किया गया था, तो उपसर्ग नहीं मिला था, और कोई रजिस्ट्री कुंजी मौजूद नहीं थी, तो PYTHONPATH का सापेक्ष संकलन-समय मूल्य जोड़ा जाता है; अन्यथा, इस चरण को अनदेखा कर दिया जाता है।
  9. संकलित मैक्रो PYTHONPATH में पथ गतिशील रूप से पाए जाने के सापेक्ष जोड़े जाते हैं sys.prefix
  10. 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 में जोड़ता है और कॉन्फ़िगरेशन फ़ाइलों के लिए नए जोड़े गए पथ का भी निरीक्षण करता है।


1
इसके डॉक्स के कहने के बावजूद, sys.executableयह सिम्लिंक हो सकता है या वास्तव में यह कुछ भी हो सकता है अगर argv[0]इसमें स्लैश हो। निष्पादन योग्य ( कॉल से) के लिए वास्तविक पथ का execv(path, argv)उपयोग नहीं किया जाता है।
jfs

1
sys.pathविंडोज़ 10 के लिए अपना पहला बिंदु के बारे में : मुझे हमेशा अपनी स्क्रिप्ट का पूरा रास्ता sys.path [0] (cwd '' नहीं) के रूप में मिलता है। आपको कुछ ऐसा करने में सक्षम होना चाहिए जैसेpython some\other\path\than\cwd\main.py
ford04

मैं @ ford04 से सहमत हूं। बिंदु 1 गलत है: विंडोज पर स्क्रिप्ट की डायरेक्टरी को sys.path में जोड़ा जाता है, न तो खाली रास्ता, न ही cwd। यह विभिन्न पायथन 3.x इंस्टॉल में है।
जिविमेन

1
वाह, यह बहुत बढ़िया है! मैं इस पर ठोकर खाने से पहले 10 अन्य प्रश्नों और उत्तरों के बारे में देखा था, "सत्य", भले ही आप यह स्वीकार कर रहे हों कि आप यह सब स्वीकार नहीं कर रहे हैं।
माइक विलियमसन

1
मैं में है कि प्रासंगिक फ़ाइलें जोड़ना होगा site-packagesहै .pthऔर .egg-linkप्रत्यय।
फ्लोरिसला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.