极高层¶
本章中的函数允许你执行文件或缓冲区中给定的 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¶