接前面python原始碼筆記之py_initializeex,嘗試看看python中用到的一些path (這部分東西太亂了...具體見pc/getpathp.c 和 modules/getpath.c 中的注釋)。
乙個python程式要有執行,必須要能找到 .py/.pyc/.pyo/.pyd/.so 等,如何找到這些模組,還真是個問題:
sys.executable
可執行程式完整路徑(其他函式可據此查詢python執行時需要的庫)
sys.prefix
平台無關檔案
python安裝路徑,用來生成標準庫搜尋路徑
sys.exec_prefix
平台相關檔案
sys.path
模組搜尋路徑
prefix 和 exec_prefix,平時用,幾乎總是一樣的,應該不用細分。
常見預設值
unix (pure)
prefix/lib/pythonx.y
/usr/local/lib/pythonx.y
unix (non-pure)
exec-prefix/lib/pythonx.y/
/usr/local/lib/pythonx.y
windows
prefix\lib
c:\pythonxy\lib\
這4個均在py_initializeex進行初始化:
初始值executable
py_getprogramfullpath()
prefix
py_getprefix()
exec_prefix
py_getexecprefix()
path
py_getpath()
pyobject *_pysys_init(void)
用來指定 prefix 和 exec_prefix 的值,格式:"theprefixpath" 或 "theprefixpath:theexec_prefixpath"。注意,指定兩個路徑時,用冒號分割。
如果使用py_setpythonhome()設定了home值,則不會使用環境變數指定的值!
設定模組的預設搜尋路徑,路徑間分隔符和平台相關:windows下分號,其他平台冒號。
除了前面的環境變數,下面3個函式也很重要(在py_initializeex之前呼叫)
注意:使用py_setpath()以後,prefix和exec_prefix都將為空。manual中說多個路徑採用分號分割!這是錯的,應該是和平台相關,windows下用分號,其他平台冒號。
大致分兩步:
prefix 的確定(linux下):
windows下,prefix和exec_prefix沒多大意思了,主要就是確定pyathon的主目錄:
即 sys.path 的初始值:
最後:動態載入模組的路徑(和exec_prefix相關),比如:exec_prefix/lib/python3.2/lib-dynload
於是,在linux下,可以見到:
'/usr/lib/python3.2'
.py/.pyc/.pyo
'/usr/lib/python3.2/plat-linux2'
平台相關的 .py/.pyc/.pyo
'/usr/lib/python3.2/lib-dynload'
動態庫的 .so
Python原始碼學習 之bytecode
原始碼 py檔案 或 字串 位元組碼 可快取在 pyc 結果 pythonx.dll libpythonx.x.a pythonx.dll libpythonx.x.a py compilestring pyeval eval compile eval 中通過import使用到的.py檔案會自動編譯...
Python原始碼學習 之 Python直譯器
include 公有 標頭檔案 lib python編寫的模組 modules c實現的模組 objects 內建物件型別的實現 pc windows下構建python的工程檔案 pcbuild parser 直譯器的 parser tokenizer input handling python 直...
Zepto原始碼之ie模組
function catch e catch e 這段 的主要作用是改寫 getcomputedstyle 方法。主要是為了 zepto 在不同的瀏覽器下,可以進行相同的操作。通過檢視 我們可以看出主要使用的方法是利用 try catch 來進行異常處理。同時這是乙個立即執行函式,使得我們在載入框架...