匯入模組

PyObject *PyImport_ImportModule(const char *name)
返回值:新的引用。 穩定 ABI 的一部分。

這是 PyImport_Import() 的包裝器,它接受一個 const char* 作為引數,而不是 PyObject*

PyObject *PyImport_ImportModuleNoBlock(const char *name)
返回值:新的引用。 穩定 ABI 的一部分。

此函式是 PyImport_ImportModule() 的已棄用別名。

在 3.3 版本中更改: 此函式在匯入鎖被另一個執行緒持有時會立即失敗。但在 Python 3.3 中,鎖定方案切換為大多數情況下每個模組鎖定,因此不再需要此函式的特殊行為。

自 3.13 版本棄用,將在 3.15 版本中刪除: 請改用 PyImport_ImportModule()

PyObject *PyImport_ImportModuleEx(const char *name, PyObject *globals, PyObject *locals, PyObject *fromlist)
返回值:新的引用。

匯入一個模組。最好參考內建 Python 函式 __import__() 來描述此函式。

返回值是對匯入的模組或頂層包的新引用,或者在失敗時返回 NULL 並設定異常。與 __import__() 一樣,當請求包的子模組時,返回值通常是頂層包,除非給定了非空的 *fromlist*。

失敗的匯入會刪除不完整的模組物件,就像 PyImport_ImportModule() 一樣。

PyObject *PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
返回值:新的引用。 自 3.7 版本起成為 穩定 ABI 的一部分。

匯入一個模組。最好參考內建 Python 函式 __import__() 來描述此函式,因為標準的 __import__() 函式直接呼叫此函式。

返回值是對匯入的模組或頂層包的新引用,或者在失敗時返回 NULL 並設定異常。與 __import__() 一樣,當請求包的子模組時,返回值通常是頂層包,除非給定了非空的 *fromlist*。

在 3.3 版本中新增。

PyObject *PyImport_ImportModuleLevel(const char *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
返回值:新的引用。 穩定 ABI 的一部分。

類似於 PyImport_ImportModuleLevelObject(),但名稱是 UTF-8 編碼的字串,而不是 Unicode 物件。

在 3.3 版本中更改: 不再接受 *level* 的負值。

PyObject *PyImport_Import(PyObject *name)
返回值:新的引用。 穩定 ABI 的一部分。

這是一個更高階的介面,它呼叫當前的“匯入鉤子函式”(顯式的 *level* 為 0,表示絕對匯入)。它呼叫當前全域性變數的 __builtins__ 中的 __import__() 函式。這意味著匯入是使用當前環境中安裝的任何匯入鉤子完成的。

此函式始終使用絕對匯入。

PyObject *PyImport_ReloadModule(PyObject *m)
返回值:新的引用。 穩定 ABI 的一部分。

重新載入一個模組。返回對重新載入的模組的新引用,或者在失敗時返回 NULL 並設定異常(在這種情況下,模組仍然存在)。

PyObject *PyImport_AddModuleRef(const char *name)
返回值:新的引用。 自 3.13 版本起成為 穩定 ABI 的一部分。

返回與模組名稱對應的模組物件。

name 引數的形式可以是 package.module。首先檢查模組字典中是否有一個,如果沒有,則建立一個新的並將其插入模組字典中。

成功時返回對模組的強引用。在失敗時返回 NULL 並設定異常。

模組名稱 *name* 是從 UTF-8 解碼的。

此函式不會載入或匯入模組;如果模組尚未載入,您將獲得一個空模組物件。使用 PyImport_ImportModule() 或其變體之一來匯入模組。如果不存在,則不會建立 *name* 的點名稱所暗示的包結構。

在 3.13 版本中新增。

PyObject *PyImport_AddModuleObject(PyObject *name)
返回值:借用引用。 自 3.7 版本起成為 穩定 ABI 的一部分。

類似於 PyImport_AddModuleRef(),但是返回一個借用引用,並且 name 是一個 Python str 物件。

在 3.3 版本中新增。

PyObject *PyImport_AddModule(const char *name)
返回值:借用引用。穩定 ABI 的一部分。

類似於 PyImport_AddModuleRef(),但是返回一個借用引用

PyObject *PyImport_ExecCodeModule(const char *name, PyObject *co)
返回值:新的引用。 穩定 ABI 的一部分。

給定一個模組名稱(可能採用 package.module 的形式)和一個從 Python 位元組碼檔案讀取或從內建函式 compile() 獲取的程式碼物件,載入該模組。返回對模組物件的新引用,或者如果發生錯誤,則返回 NULL 並設定一個異常。在錯誤情況下,name 會從 sys.modules 中移除,即使在呼叫 PyImport_ExecCodeModule()name 已經存在於 sys.modules 中。將未完全初始化的模組留在 sys.modules 中是危險的,因為匯入此類模組無法知道模組物件處於未知狀態(並且可能在模組作者的意圖方面受到損壞)。

模組的 __spec____loader__ 將會被設定,如果尚未設定,則會設定為適當的值。spec 的 loader 將被設定為模組的 __loader__ (如果已設定),否則會被設定為 SourceFileLoader 的一個例項。

模組的 __file__ 屬性將設定為程式碼物件的 co_filename。如果適用,__cached__ 也會被設定。

如果模組已被匯入,此函式將重新載入該模組。有關重新載入模組的預期方法,請參見 PyImport_ReloadModule()

如果 name 指向形如 package.module 的點狀名稱,任何尚未建立的包結構仍將不會被建立。

另請參閱 PyImport_ExecCodeModuleEx()PyImport_ExecCodeModuleWithPathnames()

在 3.12 版本中變更: 設定 __cached____loader__ 已被棄用。 有關替代方法,請參見 ModuleSpec

PyObject *PyImport_ExecCodeModuleEx(const char *name, PyObject *co, const char *pathname)
返回值:新的引用。 穩定 ABI 的一部分。

PyImport_ExecCodeModule() 類似,但如果 pathname 不為 NULL,則模組物件的 __file__ 屬性設定為 pathname

另請參閱 PyImport_ExecCodeModuleWithPathnames()

PyObject *PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, PyObject *cpathname)
返回值:新的引用。 自 3.7 版本起成為 穩定 ABI 的一部分。

PyImport_ExecCodeModuleEx() 類似,但如果 cpathname 不為 NULL,則模組物件的 __cached__ 屬性設定為 cpathname。在這三個函式中,這是首選的函式。

在 3.3 版本中新增。

在 3.12 版本中變更: 設定 __cached__ 已被棄用。 有關替代方法,請參見 ModuleSpec

PyObject *PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co, const char *pathname, const char *cpathname)
返回值:新的引用。 穩定 ABI 的一部分。

PyImport_ExecCodeModuleObject() 類似,但namepathnamecpathname 是 UTF-8 編碼的字串。如果 pathname 設定為 NULL,也會嘗試從 cpathname 中推斷出 pathname 的值。

3.2 版本中新增。

在 3.3 版本中更改: 如果僅提供了位元組碼路徑,則在計算源路徑時使用 imp.source_from_cache()

在 3.12 版本中更改: 不再使用已刪除的 imp 模組。

long PyImport_GetMagicNumber()
屬於 穩定 ABI 的一部分。

返回 Python 位元組碼檔案(又名 .pyc 檔案)的魔術數字。魔術數字應以小端位元組序存在於位元組碼檔案的前四個位元組中。發生錯誤時返回 -1

在 3.3 版本中更改: 失敗時返回值 -1

const char *PyImport_GetMagicTag()
屬於 穩定 ABI 的一部分。

返回 PEP 3147 格式的 Python 位元組碼檔名的魔術標籤字串。請記住,sys.implementation.cache_tag 中的值是權威的,應使用它而不是此函式。

3.2 版本中新增。

PyObject *PyImport_GetModuleDict()
返回值:借用引用。穩定 ABI 的一部分。

返回用於模組管理的字典(又名 sys.modules)。請注意,這是一個每個直譯器的變數。

PyObject *PyImport_GetModule(PyObject *name)
返回值:新引用。自 3.8 版本起,屬於 穩定 ABI 的一部分。

返回已匯入的具有給定名稱的模組。如果該模組尚未匯入,則返回 NULL,但不會設定錯誤。如果查詢失敗,則返回 NULL 並設定錯誤。

3.7 版本中新增。

PyObject *PyImport_GetImporter(PyObject *path)
返回值:新的引用。 穩定 ABI 的一部分。

sys.path/pkg.__path__path 返回一個查詢器物件,可能會從 sys.path_importer_cache 字典中獲取它。如果尚未快取,則遍歷 sys.path_hooks,直到找到可以處理路徑項的鉤子。如果沒有鉤子可以處理,則返回 None;這告訴我們的呼叫者 基於路徑的查詢器 找不到此路徑項的查詢器。將結果快取在 sys.path_importer_cache 中。返回對查詢器物件的新引用。

int PyImport_ImportFrozenModuleObject(PyObject *name)
自 3.7 版本起,屬於 穩定 ABI 的一部分。

載入名為 name 的凍結模組。成功返回 1,如果找不到該模組,則返回 0,如果初始化失敗,則返回 -1 並設定異常。要訪問成功載入的匯入模組,請使用 PyImport_ImportModule()。(請注意命名不當 — 如果該模組已匯入,此函式將重新載入該模組。)

在 3.3 版本中新增。

在 3.4 版本中更改: 不再在模組上設定 __file__ 屬性。

int PyImport_ImportFrozenModule(const char *name)
屬於 穩定 ABI 的一部分。

PyImport_ImportFrozenModuleObject() 類似,但名稱是 UTF-8 編碼的字串,而不是 Unicode 物件。

struct _frozen

這是凍結模組描述符的結構型別定義,由 freeze 實用程式生成(請參閱 Python 原始碼發行版中的 Tools/freeze/)。其定義在 Include/import.h 中找到,是

struct _frozen {
    const char *name;
    const unsigned char *code;
    int size;
    bool is_package;
};

在 3.11 版本中更改: 新的 is_package 欄位指示模組是否為包。這取代了將 size 欄位設定為負值。

const struct _frozen *PyImport_FrozenModules

此指標被初始化為指向 _frozen 記錄的陣列,該陣列以其成員全部為 NULL 或零的記錄終止。當匯入凍結模組時,會在該表中搜索它。第三方程式碼可以利用此表來提供動態建立的凍結模組集合。

int PyImport_AppendInittab(const char *name, PyObject *(*initfunc)(void))
屬於 穩定 ABI 的一部分。

將單個模組新增到現有內建模組表中。這是對 PyImport_ExtendInittab() 的便捷包裝器,如果無法擴充套件表,則返回 -1。新模組可以透過名稱 name 匯入,並使用函式 initfunc 作為首次嘗試匯入時呼叫的初始化函式。應在 Py_Initialize() 之前呼叫此函式。

struct _inittab

描述內建模組列表中單個條目的結構。嵌入 Python 的程式可以將這些結構的陣列與 PyImport_ExtendInittab() 結合使用,以提供額外的內建模組。該結構包含兩個成員

const char *name

模組名稱,以 ASCII 編碼的字串表示。

PyObject *(*initfunc)(void)

為內置於直譯器中的模組提供的初始化函式。

int PyImport_ExtendInittab(struct _inittab *newtab)

向內建模組表中新增一組模組。newtab 陣列必須以一個哨兵條目結束,該條目的 name 欄位包含 NULL;未能提供哨兵值可能會導致記憶體錯誤。成功時返回 0,如果無法分配足夠的記憶體來擴充套件內部表,則返回 -1。如果發生故障,則不會向內部表新增任何模組。必須在 Py_Initialize() 之前呼叫此函式。

如果多次初始化 Python,則必須在每次 Python 初始化之前呼叫 PyImport_AppendInittab()PyImport_ExtendInittab()