最高层

本章中的函数将允许你执行文件或缓冲区中给定的 Python 源代码,但它们不允许你以更详细的方式与解释器进行交互。

这些函数中的几个接受语法中的起始符号作为参数。 可用的起始符号是 Py_eval_inputPy_file_inputPy_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()) 解码。如果 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 设置为 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 为真,则在 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) 的函数,它会覆盖默认的用于在解释器提示符处读取单行输入的函数。该函数应在 promptNULL 时输出 prompt 字符串,然后从提供的标准输入文件中读取一行输入,并返回结果字符串。例如,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 指定起始符号,并且必须是以下之一:Py_eval_inputPy_file_inputPy_single_input

以 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 为真,则在 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__ 为真)、1 (断言被移除,__debug__ 为假) 或 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 参数基本上可以忽略——如果为真,它会导致立即抛出异常;这用于生成器对象的 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 字段。

可用的编译器标志可通过宏访问

PyCF_ALLOW_TOP_LEVEL_AWAIT
PyCF_ONLY_AST
PyCF_OPTIMIZED_AST
PyCF_TYPE_COMMENTS

参见 ast Python 模块文档中的编译器标志,该模块以相同的名称导出这些常量。

上述“PyCF”标志可以与“CO_FUTURE”标志(例如 CO_FUTURE_ANNOTATIONS)结合使用,以启用通常可通过未来语句选择的功能。有关完整列表,请参见代码对象标志