python用法 - Python的sys.path從哪裡初始化?




sys python用法 (2)

Python的sys.path從哪裡初始化?

UPD :Python在引用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之前的路線是從哪裡來的?



Python真的很難智能地設置sys.path 。 它如何設置會變得really complicated 。 下面的指南是一個貶低的,有點不完整的,有點不對的,但有用的指南,用於排名和文件的python程序員,當python找出什麼用作sys.path初始值時會發生什麼, sys.executablesys.exec_prefixsys.prefix在一個正常的 python安裝。

首先,python根據操作系統告訴它的最佳級別來確定它在文件系統上的實際物理位置。 如果操作系統只是說“python”正在運行,它會發現自己在$ PATH中。 它解決了任何符號鏈接。 完成此操作後,它找到的可執行文件的路徑將用作sys.executable可執行文件的值,而不是ifs, sys.executable或buts。

接下來,它確定sys.exec_prefixsys.prefix的初始值。

如果在與pyvenv.cfg相同的目錄或一個目錄中有一個名為pyvenv.cfg的文件,python會查看它。 不同的操作系統對這個文件做了不同的事情。

python查找的配置文件中的一個值是配置選項home = <DIRECTORY> 。 Python將在sys.executable動態設置sys.prefix的初始值時使用此目錄而不是包含sys.executable的目錄。 如果pyvenv.cfg applocal = true設置出現在Windows上的pyvenv.cfg文件中,但不是home = <DIRECTORY>設置,則sys.prefix將設置為包含sys.executable的目錄。

接下來,檢查PYTHONHOME環境變量。 在Linux和Mac上, sys.prefixsys.exec_prefix被設置為PYTHONHOME環境變量(如果存在), 取代 pyvenv.cfg任何home = <DIRECTORY>設置。 在Windows上, sys.prefixPYTHONHOME存在home = <DIRECTORY>設置, 否則 sys.prefixsys.exec_prefix會設置為PYTHONHOME環境變量(如果存在)。

否則,這些sys.prefixsys.exec_prefix可以從sys.executable的位置向後走,或者是pyvenv.cfg給出的home目錄(如果有的話)。

如果在該目錄或其任何父目錄中找到文件lib/python<version>/dyn-load ,則該目錄將設置為Linux或Mac上的sys.exec_prefix 。 如果在目錄或其任何子目錄中找到文件lib/python<version>/os.py ,則該目錄在Linux,Mac和Windows上設置為sys.exec_prefix ,且sys.exec_prefix設置為相同值作為Windows上的sys.prefix 。 如果設置了applocal = true則在Windows上跳過整個步驟。 可以使用sys.executable的目錄,或者,如果在pyvenv.cfg設置了pyvenv.cfg ,那麼將使用sys.prefix的初始值。

如果它找不到這些“標誌性”文件或sys.prefix尚未找到,則python sys.prefix設置為“fallback”值。 例如,Linux和Mac使用預編譯的默認值作為sys.prefixsys.exec_prefix的值。 Windows會等待,直到sys.path完全解決為sys.prefix設置回退值。

然後,(你一直在等待什麼)python決定了sys.path包含的初始值。

  1. python正在執行的腳本的目錄被添加到sys.path 。 在Windows上,這總是空字符串,它告訴python改為使用當前工作目錄。
  2. 如果設置了PYTHONPATH環境變量的內容,則會添加到sys.path除非您在Windows上,並且pyvenv.cfg中的pyvenv.cfg設置為true。
  3. Linux上的<prefix>/lib/python35.zip<prefix>/lib/python35.zip上的os.path.join(os.dirname(sys.executable), "python.zip")的zip文件路徑被添加到sys.path
  4. 如果在Windows上並且pyvenv.cfg沒有設置pyvenv.cfg applocal = true ,則會添加註冊表項HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\的子項的內容(如果有的話)。
  5. 如果在Windows上並且pyvenv.cfg沒有設置pyvenv.cfg applocal = true ,並且sys.prefix ,則會添加註冊表項HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\核心內容 ,如果存在的話;
  6. 如果在Windows上並且pyvenv.cfg沒有設置pyvenv.cfg applocal = true ,則會添加註冊表項HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\的子項的內容(如果有的話)。
  7. 如果在Windows上並且pyvenv.cfg沒有設置pyvenv.cfg applocal = true ,並且sys.prefix ,則會添加註冊表項HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\核心內容 ,如果存在的話;
  8. 如果在Windows上,並且未設置PYTHONPATH,則未找到前綴,並且不存在任何註冊表項,則會添加PYTHONPATH的相對編譯時間值; 否則,這一步被忽略。
  9. 編譯時宏PYTHONPATH中的路徑相對於動態找到的sys.prefix被添加。
  10. 在Mac和Linux上,添加了sys.exec_prefix的值。 在Windows上,添加了用於(或將用於)動態搜索sys.prefix

在Windows上的這個階段,如果沒有找到前綴,那麼python將嘗試通過搜索sys.path中的所有目錄來確定它的地標文件,因為它試圖先前處理sys.executable目錄,直到找到一些東西。 如果沒有, sys.prefix留空。

最後,在所有這些之後,Python加載了site模塊,它進一步向sys.path添加了一些東西:

它首先從頭部和尾部構建四個目錄。 對於頭部分,它使用sys.prefixsys.exec_prefix ; 空頭被跳過。 對於尾部,它使用空字符串,然後使用lib/site-packages (在Windows上)或lib/pythonX.Y/site-packages ,然後使用lib/site-python (在Unix和Macintosh上)。 對於每個不同的頭尾組合,它會查看它是否指向現有目錄,如果是,則將其添加到sys.path中,並檢查新添加的配置文件路徑。





sys