2009-05-22 76 views
68

Python的sys.path從哪裏初始化?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的那些那些路徑從何而來?

回答

36

「從環境變量PYTHONPATH初始化,再加上安裝相關的默認」

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

+5

我猜他們來自現場模塊: http://docs.python.org/library/site.html – ashcatch 2009-05-22 14:10:44

+12

該網站模塊加載並解析您的站點包的任何.pth文件的內容目錄。這些.pth文件包含對PYTHONPATH的補充 – ASk 2009-05-22 21:03:21

29

Python的真正力圖智能設置sys.path。 怎麼設定可以得到reallycomplicated。下面的指南是一個打了折扣的, 有點不完全,有些-錯,但希望-有用的指導 對發生了什麼的職級和文件Python程序員時蟒蛇 計算出的初始值使用什麼sys.path, sys.executable,sys.exec_prefixsys.prefix上一個正常 python安裝。

首先,python根據操作系統告知 的情況,盡其最大努力找出文件系統上的實際物理位置 。如果操作系統只是說「python」正在運行,它會發現自己在$ PATH中。 它解決了任何符號鏈接。完成此操作後,它找到的可執行文件的路徑 將用作sys.executable的值,否ifs, ands或buts。

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

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

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

接下來,檢查PYTHONHOME環境變量。在Linux和Mac, sys.prefixsys.exec_prefix設置爲PYTHONHOME環境變量,如果 存在,任何home = <DIRECTORY>設置在pyvenv.cfg。在Windows中, sys.prefixsys.exec_prefix設置爲PYTHONHOME環境變量, 如果它存在,除非一個設置home = <DIRECTORY>存在於pyvenv.cfg, 其用於代替。

否則,這些sys.prefixsys.exec_prefix被從如有由pyvenv.cfg給出sys.executable的位置,或home目錄倒着走 發現。

如果文件lib/python<version>/dyn-load在該目錄 或其任何父目錄中發現,該目錄被設置爲是在Linux或Mac sys.exec_prefix。如果文件 lib/python<version>/os.py在目錄或任何其 子目錄中發現,該目錄被設置爲sys.prefix在Linux上, 的Mac和Windows,與sys.exec_prefix設置爲相同的值,在Windows sys.prefix。如果設置了 applocal = true,則在Windows上跳過整個步驟。或者sys.executable的目錄爲 ,或者如果home設置爲pyvenv.cfg,則代替 使用初始值sys.prefix

如果找不到這些「地標」文件或sys.prefix一直沒有找到 還,那麼Python套sys.prefix一個「回退」 值。例如,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是 和applocal設置爲true在pyvenv.cfg
  3. 在Windows上,Linux/Mac上的<prefix>/lib/python35.zip和Windows上的 os.path.join(os.dirname(sys.executable), "python.zip")的zip文件路徑被添加到sys.path
  4. 如果在Windows上並且在pyvenv.cfg中沒有設置applocal = true,則會添加註冊表項 HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\的子項的內容(如果有)。
  5. 如果在Windows上,沒有applocal = truepyvenv.cfg設置,並且sys.prefix找不到, 那麼核心內容的註冊表項HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\添加,如果它存在的;
  6. 如果在Windows上並且在pyvenv.cfg中沒有設置applocal = true,則會添加註冊表項 HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\的子項的內容(如果有)。
  7. 如果在Windows上,沒有applocal = truepyvenv.cfg設置,並且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.prefix留空。

最後,這一切後,巨蟒加載site模塊,它增加了東西又進一步sys.path

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