極高層¶
本章中的函式允許你執行檔案或緩衝區中給定的 Python 原始碼,但它們不允許你以更詳細的方式與直譯器互動。
這些函式中的幾個接受來自語法的起始符號作為引數。可用的起始符號為 Py_eval_input
, Py_file_input
, 和 Py_single_input
。這些將在接受它們作為引數的函式之後進行描述。
另請注意,這些函式中的幾個採用 FILE* 引數。一個需要小心處理的特殊問題是,不同 C 庫的 FILE
結構可能不同且不相容。在 Windows(至少)下,動態連結的擴充套件實際上可以使用不同的庫,因此應注意,只有在確定 FILE* 引數是由 Python 執行時使用的同一庫建立的情況下,才將其傳遞給這些函式。
-
int PyRun_AnyFile(FILE *fp, const char *filename)¶
這是下面
PyRun_AnyFileExFlags()
的簡化介面,保留 closeit 設定為0
,flags 設定為NULL
。
-
int PyRun_AnyFileFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)¶
這是下面
PyRun_AnyFileExFlags()
的簡化介面,保留 closeit 引數設定為0
。
-
int PyRun_AnyFileEx(FILE *fp, const char *filename, int closeit)¶
這是下面
PyRun_AnyFileExFlags()
的簡化介面,保留 flags 引數設定為NULL
。
-
int PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags)¶
如果 fp 指向與互動裝置(控制檯或終端輸入或 Unix 偽終端)關聯的檔案,則返回
PyRun_InteractiveLoop()
的值,否則返回PyRun_SimpleFile()
的結果。filename 是從檔案系統編碼 (sys.getfilesystemencoding()
) 解碼的。如果 filename 為NULL
,則此函式使用"???"
作為檔名。如果 closeit 為真,則在PyRun_SimpleFileExFlags()
返回之前關閉該檔案。
-
int PyRun_SimpleString(const char *command)¶
這是下面
PyRun_SimpleStringFlags()
的簡化介面,將PyCompilerFlags
* 引數設定為NULL
。
-
int PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)¶
根據 flags 引數,在
__main__
模組中執行來自 command 的 Python 原始碼。如果__main__
尚不存在,則會建立它。成功時返回0
,如果引發異常則返回-1
。如果發生錯誤,則無法獲取異常資訊。有關 flags 的含義,請參見下文。請注意,如果引發了其他未處理的
SystemExit
,則只要PyConfig.inspect
為零,此函式將不會返回-1
,而是退出程序。
-
int PyRun_SimpleFile(FILE *fp, const char *filename)¶
這是下面
PyRun_SimpleFileExFlags()
的簡化介面,保留 closeit 設定為0
,flags 設定為NULL
。
-
int PyRun_SimpleFileEx(FILE *fp, const char *filename, int closeit)¶
這是下面
PyRun_SimpleFileExFlags()
的簡化介面,flags 設定為NULL
。
-
int PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags)¶
類似於
PyRun_SimpleStringFlags()
,但是 Python 原始碼是從 fp 中讀取的,而不是從記憶體中的字串讀取的。filename 應該是檔名,它是從檔案系統編碼和錯誤處理程式解碼的。如果 closeit 為 true,則在PyRun_SimpleFileExFlags()
返回之前關閉檔案。注意
在 Windows 上,fp 應該以二進位制模式開啟(例如
fopen(filename, "rb")
)。否則,Python 可能無法正確處理以 LF 換行符結尾的指令碼檔案。
-
int PyRun_InteractiveOne(FILE *fp, const char *filename)¶
這是下面
PyRun_InteractiveOneFlags()
的簡化介面,flags 設定為NULL
。
-
int PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)¶
根據 flags 引數,從與互動裝置關聯的檔案中讀取並執行單個語句。將使用
sys.ps1
和sys.ps2
提示使用者。filename 是從檔案系統編碼和錯誤處理程式解碼的。如果輸入執行成功,則返回
0
;如果發生異常,則返回-1
;如果存在解析錯誤,則返回作為 Python 一部分分發的errcode.h
包含檔案中的錯誤程式碼。(請注意,errcode.h
不包含在Python.h
中,因此如果需要,必須專門包含它。)
-
int PyRun_InteractiveLoop(FILE *fp, const char *filename)¶
這是下面
PyRun_InteractiveLoopFlags()
的簡化介面,flags 設定為NULL
。
-
int PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)¶
從與互動裝置關聯的檔案中讀取並執行語句,直到到達 EOF。將使用
sys.ps1
和sys.ps2
提示使用者。filename 是從檔案系統編碼和錯誤處理程式解碼的。在 EOF 時返回0
,失敗時返回負數。
-
int (*PyOS_InputHook)(void)¶
- 屬於穩定 ABI的一部分。
可以設定為指向具有原型
int func(void)
的函式。當 Python 直譯器的提示符即將空閒並等待使用者從終端輸入時,將呼叫該函式。返回值將被忽略。覆蓋此掛鉤可用於將直譯器的提示與其他事件迴圈整合,就像在 Python 原始碼中的Modules/_tkinter.c
中所做的那樣。在 3.12 版本中更改: 此函式僅從主直譯器呼叫。
-
char *(*PyOS_ReadlineFunctionPointer)(FILE*, FILE*, const char*)¶
可以設定為指向具有原型
char *func(FILE *stdin, FILE *stdout, char *prompt)
的函式,從而覆蓋用於在直譯器提示符下讀取單行輸入的預設函式。該函式應輸出字串 prompt(如果它不是NULL
),然後從提供的標準輸入檔案中讀取一行輸入,並返回結果字串。例如,readline
模組設定此掛鉤以提供行編輯和 Tab 鍵補全功能。結果必須是由
PyMem_RawMalloc()
或PyMem_RawRealloc()
分配的字串,或者如果發生錯誤,則為NULL
。在 3.4 版本中更改: 結果必須由
PyMem_RawMalloc()
或PyMem_RawRealloc()
分配,而不是由PyMem_Malloc()
或PyMem_Realloc()
分配。在 3.12 版本中更改: 此函式僅從主直譯器呼叫。
-
PyObject *PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals)¶
- 返回值:新引用。
這是下面
PyRun_StringFlags()
的簡化介面,flags 設定為NULL
。
-
PyObject *PyRun_StringFlags(const char *str, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags)¶
- 返回值:新引用。
在由 globals 和 locals 物件指定的上下文中,使用 flags 指定的編譯器標誌執行來自 str 的 Python 原始碼。globals 必須是一個字典;locals 可以是任何實現了對映協議的物件。引數 start 指定應該用於解析原始碼的起始標記。
返回執行程式碼的 Python 物件結果,如果引發異常,則返回
NULL
。
-
PyObject *PyRun_File(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals)¶
- 返回值:新引用。
這是
PyRun_FileExFlags()
的簡化介面,將 closeit 設定為0
,flags 設定為NULL
。
-
PyObject *PyRun_FileEx(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit)¶
- 返回值:新引用。
這是
PyRun_FileExFlags()
的簡化介面,將 flags 設定為NULL
。
-
PyObject *PyRun_FileFlags(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags)¶
- 返回值:新引用。
這是
PyRun_FileExFlags()
的簡化介面,將 closeit 設定為0
。
-
PyObject *PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit, PyCompilerFlags *flags)¶
- 返回值:新引用。
類似於
PyRun_StringFlags()
,但是 Python 原始碼是從 fp 而不是記憶體中的字串讀取的。filename 應該是檔案的名稱,它是從檔案系統編碼和錯誤處理程式解碼的。如果 closeit 為 true,則檔案在PyRun_FileExFlags()
返回之前關閉。
-
PyObject *Py_CompileString(const char *str, const char *filename, int start)¶
- 返回值:新引用。 穩定 ABI 的一部分。
這是
Py_CompileStringFlags()
的簡化介面,將 flags 設定為NULL
。
-
PyObject *Py_CompileStringFlags(const char *str, const char *filename, int start, PyCompilerFlags *flags)¶
- 返回值:新引用。
這是
Py_CompileStringExFlags()
的簡化介面,將 optimize 設定為-1
。
-
PyObject *Py_CompileStringObject(const char *str, PyObject *filename, int start, PyCompilerFlags *flags, int optimize)¶
- 返回值:新引用。
解析並編譯 str 中的 Python 原始碼,返回生成的程式碼物件。起始標記由 start 給出;這可以用來約束可以編譯的程式碼,應該為
Py_eval_input
、Py_file_input
或Py_single_input
。filename 指定的檔名用於構造程式碼物件,並且可能出現在回溯或SyntaxError
異常訊息中。如果程式碼無法解析或編譯,則返回NULL
。整數 optimize 指定編譯器的最佳化級別;值
-1
選擇由-O
選項給出的直譯器的最佳化級別。顯式級別為0
(無最佳化;__debug__
為 true),1
(斷言被刪除,__debug__
為 false)或2
(文件字串也被刪除)。3.4 版本新增。
-
PyObject *Py_CompileStringExFlags(const char *str, const char *filename, int start, PyCompilerFlags *flags, int optimize)¶
- 返回值:新引用。
類似於
Py_CompileStringObject()
,但 *filename* 是從檔案系統編碼和錯誤處理程式解碼的位元組字串。3.2 版本新增。
-
PyObject *PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)¶
- 返回值:新引用。 穩定 ABI 的一部分。
這是一個簡化的
PyEval_EvalCodeEx()
介面,僅包含程式碼物件、全域性變數和區域性變數。其他引數設定為NULL
。
-
PyObject *PyEval_EvalCodeEx(PyObject *co, PyObject *globals, PyObject *locals, PyObject *const *args, int argcount, PyObject *const *kws, int kwcount, PyObject *const *defs, int defcount, PyObject *kwdefs, PyObject *closure)¶
- 返回值:新引用。 穩定 ABI 的一部分。
根據特定的執行環境評估預編譯的程式碼物件。此環境由全域性變數字典、區域性變數的對映物件、引數陣列、關鍵字和預設值、僅限關鍵字引數的預設值字典以及單元格的閉包元組組成。
-
PyObject *PyEval_EvalFrame(PyFrameObject *f)¶
- 返回值:新引用。 穩定 ABI 的一部分。
評估執行幀。這是一個簡化的
PyEval_EvalFrameEx()
介面,用於向後相容。
-
PyObject *PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)¶
- 返回值:新引用。 穩定 ABI 的一部分。
這是 Python 解釋的主要、未經修飾的函式。與執行幀 *f* 關聯的程式碼物件將被執行,根據需要解釋位元組碼並執行呼叫。附加的 *throwflag* 引數在大多數情況下可以忽略 - 如果為 true,則會導致立即丟擲異常;這用於生成器物件的
throw()
方法。在 3.4 版本中更改:此函式現在包含一個除錯斷言,以幫助確保它不會靜默丟棄活動異常。
-
int PyEval_MergeCompilerFlags(PyCompilerFlags *cf)¶
此函式更改當前評估幀的標誌,成功時返回 true,失敗時返回 false。
-
int Py_eval_input¶
Python 語法中用於獨立表示式的起始符號;用於
Py_CompileString()
。
-
int Py_file_input¶
Python 語法中用於從檔案或其他來源讀取的語句序列的起始符號;用於
Py_CompileString()
。這是編譯任意長度的 Python 原始碼時要使用的符號。
-
int Py_single_input¶
Python 語法中用於單個語句的起始符號;用於
Py_CompileString()
。這是互動式直譯器迴圈使用的符號。
-
struct PyCompilerFlags¶
這是用於儲存編譯器標誌的結構。在僅編譯程式碼的情況下,它作為
int flags
傳遞,在執行程式碼的情況下,它作為PyCompilerFlags *flags
傳遞。在這種情況下,from __future__ import
可以修改 *flags*。每當
PyCompilerFlags *flags
為NULL
時,cf_flags
將被視為等於0
,並且任何因from __future__ import
而進行的修改都將被丟棄。-
int cf_flags¶
編譯器標誌。
-
int cf_feature_version¶
cf_feature_version 是次要的 Python 版本。它應該初始化為
PY_MINOR_VERSION
。預設情況下會忽略該欄位,僅當在
cf_flags
中設定PyCF_ONLY_AST
標誌時才會使用它。
在 3.8 版本中更改:添加了 cf_feature_version 欄位。
-
int cf_flags¶