高层层

本章中的函数将允许您执行文件或缓冲区中提供的 Python 源代码,但不允许您与解释器进行更详细的交互。

这些函数中的几个函数接受语法中的开始符号作为参数。可用的开始符号是Py_eval_inputPy_file_inputPy_single_input。这些在接受它们作为参数的函数之后进行描述。

还要注意,其中一些函数带有FILE*参数。需要谨慎处理的一个特殊问题是,不同 C 库的FILE结构可能不同且不兼容。在 Windows(至少)下,动态链接的扩展实际上可能使用不同的库,因此应注意,只有在确定FILE*参数是由与 Python 运行时相同的库创建的情况下,才将FILE*参数传递给这些函数。正在使用。

  • int Py_Main(int * argc *,char *** argv *)
    • 标准解释器的主程序。这适用于嵌入 Python 的程序。 * argc argv *参数应与传递给 C 程序的main()函数的参数完全一样。重要的是要注意,可以修改参数列表(但参数列表指向的字符串的内容不能修改)。如果解释器正常退出(即,无异常),则返回值为0;如果解释器由于异常而退出,则返回值为1;如果参数列表未表示有效的 Python 命令行,则返回值为2

请注意,如果引发了其他未处理的SystemExit,则只要未设置Py_InspectFlag,该函数就不会返回1,而是退出该过程。

  • int PyRun_AnyFile(FILE *fp ,const char filename *)

  • int PyRun_AnyFileFlags(FILE *fp ,const char filename *,PyCompilerFlags ** flags *)

  • int PyRun_AnyFileEx(FILE *fp ,const char filename *,int * closeit *)

  • int PyRun_AnyFileExFlags(FILE *fp ,const char filename *,int * closeit *,PyCompilerFlags ** flags *)

    • 如果* fp 指向与交互式设备(控制台或终端 Importing 或 Unix 伪终端)关联的文件,则返回PyRun_InteractiveLoop()的值,否则返回PyRun_SimpleFile()的结果。如果 filename NULL *,则此函数使用"???"作为文件名。
  • int PyRun_SimpleString(const char ** command *)

  • int PyRun_SimpleStringFlags(const char *command PyCompilerFlags flags *)

    • 根据* flags 参数从main模块中的 command 执行 Python 源代码。如果main不存在,则会创建它。成功返回0,如果引发异常则返回-1。如果有错误,则无法获取异常信息。有关 flags 的含义,请参见下文。

请注意,如果引发了其他未处理的SystemExit,则只要未设置Py_InspectFlag,该函数就不会返回-1,而是退出该过程。

  • int PyRun_SimpleFile(FILE *fp ,const char filename *)

  • int PyRun_SimpleFileFlags(FILE *fp ,const char filename *,PyCompilerFlags ** flags *)

  • int PyRun_SimpleFileEx(FILE *fp ,const char filename *,int * closeit *)

  • int PyRun_SimpleFileExFlags(FILE *fp ,const char filename *,int * closeit *,PyCompilerFlags ** flags *)

    • PyRun_SimpleStringFlags()相似,但是 Python 源代码是从* fp *读取的,而不是从内存中的字符串读取的。 * filename 应该是文件名。如果 closeit *为 true,则在 PyRun_SimpleFileExFlags 返回之前关闭文件。
  • int PyRun_InteractiveOne(FILE *fp ,const char filename *)

  • int PyRun_InteractiveOneFlags(FILE *fp ,const char filename *,PyCompilerFlags ** flags *)

    • 根据* flags *参数从与交互式设备关联的文件中读取并执行一条语句。将使用sys.ps1sys.ps2提示用户。成功执行 Importing 后,返回0;如果发生异常,则返回-1;如果存在解析错误,则返回errcode.h include 文件中作为 Python 的一部分分发的错误代码。 (请注意,Python.h不包含errcode.h,因此,如果需要,则必须特别包含.)
  • int PyRun_InteractiveLoop(FILE *fp ,const char filename *)

  • int PyRun_InteractiveLoopFlags(FILE *fp ,const char filename *,PyCompilerFlags ** flags *)

    • 从与交互式设备关联的文件中读取和执行语句,直到达到 EOF。将使用sys.ps1sys.ps2提示用户。在 EOF 返回0
  • struct _node * PyParser_SimpleParseString(const char ** str *,int * start *)

  • struct _node * PyParser_SimpleParseStringFlags(const char ** str *,int * start *,int * flags *)

  • struct _node * PyParser_SimpleParseStringFlagsFilename(const char *str ,const char filename *,int * start *,int * flags *)

    • 根据* flags 参数,使用 start 令牌 start str *解析 Python 源代码。结果可用于创建可以有效评估的代码对象。如果必须多次评估代码片段,这很有用。
  • struct _node * PyParser_SimpleParseFile(FILE *fp ,const char filename *,int * start *)

  • struct _node * PyParser_SimpleParseFileFlags(FILE *fp ,const char filename *,int * start *,int * flags *)

  • PyObject * PyRun_String(const char **str ,int * start PyObject globals *,PyObject ** locals *)

    • 返回值:新参考.

这是下面PyRun_StringFlags()的简化接口,将* flags 设置为 NULL *。

在* globals locals 字典指定的上下文中,pass strs 指定的编译器标志从 str 执行 Python 源代码。参数 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 *。

这是下面PyRun_FileExFlags()的简化界面,将* closeit *设置为0

PyRun_StringFlags()相似,但是 Python 源代码是从* fp *读取的,而不是从内存中的字符串读取的。 * filename 应该是文件名。如果 closeit *为 true,则在PyRun_FileExFlags()返回之前关闭文件。

  • PyObject * Py_CompileString(const char *str ,const char filename *,int * start *)
    • 返回值:新参考.

这是下面Py_CompileStringFlags()的简化接口,将* flags 设置为 NULL *。

  • PyObject * Py_CompileStringFlags(const char *str ,const char filename *,int * start *,PyCompilerFlags ** flags *)
    • 返回值:新参考.

解析并编译* str 中的 Python 源代码,返回生成的代码对象。起始令牌由 start *给出;这可以用来约束可以编译的代码,它们应该是Py_eval_inputPy_file_inputPy_single_input。 * filename 指定的文件名用于构造代码对象,并可能出现在回溯或SyntaxError异常消息中。如果无法解析或编译代码,则返回 NULL *。

这是PyEval_EvalCodeEx()的简化接口,仅包含代码对象以及全局和局部变量的字典。其他参数设置为* NULL *。

  • PyObject * PyEval_EvalCodeEx(PyCodeObject *co PyObject globals *,PyObject *locals PyObject * args *,int * argcount *,PyObject *** kws ,int * kwcount PyObject * defs *,int * defcount *,PyObject ** closure *)

    • 给定一个特定的评估环境,评估预编译的代码对象。该环境由全局和局部变量字典,参数数组,关键字和默认值以及单元格的闭合 Tuples 组成。
  • PyObject * PyEval_EvalFrame(PyFrameObject ** f *)

    • 评估执行框架。这是 PyEval_EvalFrameEx 的简化接口,用于向后兼容。
  • PyObject * PyEval_EvalFrameEx(PyFrameObject ** f *,int * throwflag *)

    • 这是 Python 解释的主要Function。实际上是 2000 行。与执行帧* f 相关联的代码对象被执行,解释字节码并根据需要执行调用。额外的 throwflag *参数通常可以忽略-如果为 true,则它会立即引发异常;用于生成器对象的throw()方法。
  • 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()一起使用。这是用于交互式解释器循环的符号。
  • 结构PyCompilerFlags
    • 这是用于保存编译器标志的结构。在仅编译代码的情况下,将其作为int flags传递,而在正在执行代码的情况下,将其作为PyCompilerFlags *flags传递。在这种情况下,from __future__ import可以修改* flags *。

每当PyCompilerFlags *flags为* NULL *时,cf_flags就被视为等于0,并且由于from __future__ import而导致的任何修改都将被丢弃。

struct PyCompilerFlags {
    int cf_flags;
}
  • int CO_FUTURE_DIVISION
    • 可以在* flags *中设置该位,以使除法运算符/根据 PEP 238解释为“真除法”。