極高層

本章中的函式允許你執行檔案或緩衝區中給定的 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 設定為 0flags 設定為 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()) 解碼的。如果 filenameNULL,則此函式使用 "???" 作為檔名。如果 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 設定為 0flags 設定為 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.ps1sys.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.ps1sys.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)
返回值:新引用。

在由 globalslocals 物件指定的上下文中,使用 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 設定為 0flags 設定為 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_inputPy_file_inputPy_single_inputfilename 指定的檔名用於構造程式碼物件,並且可能出現在回溯或 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 *flagsNULL 時,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 CO_FUTURE_DIVISION

可以在 *flags* 中設定此位,以使除法運算子 / 根據 PEP 238 被解釋為“真除法”。