Python原始碼學習 之模組路徑

2021-08-26 04:56:34 字數 1687 閱讀 2493

接前面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 來進行異常處理。同時這是乙個立即執行函式,使得我們在載入框架...