匯入模組¶
-
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 是一個 Pythonstr
物件。在 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。
-
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()
類似,但name、pathname 和 cpathname 是 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 編碼的字串表示。
-
const char *name¶
-
int PyImport_ExtendInittab(struct _inittab *newtab)¶
向內建模組表中新增一組模組。newtab 陣列必須以一個哨兵條目結束,該條目的
name
欄位包含NULL
;未能提供哨兵值可能會導致記憶體錯誤。成功時返回0
,如果無法分配足夠的記憶體來擴充套件內部表,則返回-1
。如果發生故障,則不會向內部表新增任何模組。必須在Py_Initialize()
之前呼叫此函式。如果多次初始化 Python,則必須在每次 Python 初始化之前呼叫
PyImport_AppendInittab()
或PyImport_ExtendInittab()
。