执行文件或字符串中的Python代码

执行文件或字符串中的Python代码

  • int Py_Main(int argc, wchar_t **argv)
    调用python解释器,并将参数传给解释器,注意第二个参数为wchar_t 类型。返回0:解释器正常退出;返回1:解释器由于异常而退出;返回2:argv不是有效的python命令行。
# 文件名hello.py
print("hello world")
// 文件名hello.c
#include <python3.4m/Python.h>
#include <stdio.h>
int main()
{
    Py_Initialize();
    wchar_t *argv[] = {L"python3", L"hello.py"};
    Py_Main(2, argv);
    Py_Finalize();
    return 0;
}

编译hello.c,gcc hello.c -std=c99 -lpython3.4m -o hello
运行./hello,输出 hello world

  • int PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags)
  • int PyRun_AnyFile(FILE *fp, const char *filename) // closeit=0, flags=NULL
  • int PyRun_AnyFileFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) // closeit=0
  • int PyRun_AnyFileEx(FILE *fp, const char *filename, int closeit) // flags=NULL
    若fp指向一个交互式设备(终端),则返回值为PyRun_InteractiveLoop()的结果,否则返回PyRun_SimpleFile()的结果。filename根据文件系统编码方式(sys.getfilesystemencoding())进行解码,filename为NULL,函数将使用???代替文件名。

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

  • int PyRun_SimpleString(const char *command) // flags=NULL
    _ _main_ _ 模块中按照flags执行字符串commond中的python代码,成功返回0,失败返回-1,若发生异常,是无法获得异常信息的。
const char *command = "prinf(\"Hello World\")";
PyRun_SimpleString(command);

输出Hello World

  • int PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags)
  • int PyRun_SimpleFile(FILE *fp, const char *filename) // closeit=0, flags=NULL
  • int PyRun_SimpleFileEx(FILE *fp, const char *filename, int closeit) // flags=NULL
    与函数PyRun_SimpleStringFlags() 类似,不同的是该函数从文件fp中读取python代码并执行;filename为文件名,使用文件系统编码进行解码;若closeit为true,则在函数返回前关闭文件fp。
const char *filename = "hello.py";
FILE *fp = fopen(filename, "r");
PyRun_SimpleFile(fp, filename);

输出Hello World

  • int PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
  • int PyRun_InteractiveOne(FILE *fp, const char *filename) // flags=NULL
    按照flags从fp关联的交互式终端中读取一条Python语句、执行并返回。输入提示符为sys.ps1(>>>)和sys.ps2(…),filename使用文件系统编码进行解码。当输入正常执行时返回0,发生异常时返回-1或者errcode.h中的某个错误码,注意:errcode.h默认是没有include的,若需要则要显示的include之。

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

  • int PyRun_InteractiveLoop(FILE *fp, const char *filename) // flags=NULL
    按照flags从fp关联的交互式终端中读取python语句知道遇到EOF为止。输入提示符为sys.ps1(>>>)和sys.ps2(…),filename使用文件系统编码进行解码。当遇到EOF时,返回0。

  • int (*PyOS_InputHook)(void)
    可被设置指向int func(void) 型的函数,该函数会在Python解释器空闲、等待用户输入时被调用,函数的返回值被忽略。Overriding this hook can be used to integrate the interpreter’s prompt with other event loops, as done in the Modules/_tkinter.c in the Python source code.

  • char * (PyOS_ReadlineFunctionPointer)(FILE , FILE , const char )
    可被设置指向一个对应类型的函数,改写该指针可使解释器在提示符处读取代码时,从指定的标准数据fp读取,并返回执行结果。readline模块就利用该方法实现了行编辑和tab不全功能。返回值的空间从3.4版本开始一定要使用PyMem_RawMalloc()PyMem_RawRealloc() 进行分配。

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

  • struct_node * PyParser_SimpleParseString(const char *str, int start) // filename=NULL, flags=0
  • struct_node * PyParser_SimpleParseStringFlags(const char *str, int start, int flags) // filename=NULL
    按照flags,从str的start位置开始解析python代码。该函数可用于创建一个code对象,code对象执行的效率更高,当一段代码要执行多次时,该方法很有效。filename按照文件系统的编码方式(sys.getfilesystemencoding())进行解码。

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

  • struct_node * PyParser_SimpleParseFile(FILE *fp, const char *filename, int start) // flags=0
    PyParser_SimpleParseStringFlagsFilename() 类似,只是从文件中读取python代码。

  • PyObject * PyRun_StringFlags(const char *str, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags)

  • PyObject * PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals) // flags=NULL
    Return value: New reference. Execute Python source code from str in the context specified by the dictionaries globals and locals with the compiler flags specified by flags. The parameter start specifies the start token that should be used to parse the source code.
    Returns the result of executing the code as a Python object, or NULL if an exception was raised.

  • PyObject *PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit, PyCompilerFlags *flags)

  • PyObject *PyRun_File(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals) // closeit=0, flags=NULL
  • PyObject *PyRun_FileEx(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit) // flags=NULL
  • PyObject *PyRun_FileFlags(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags) // closeit=0
    PyRun_StringFlags() 类似,只是从文件中读取python代码,closeit为true则在函数返回前关闭fp。

  • Py_CompileStringObject()
  • Py_CompileStringExFlags()
  • PyEval_EvalCodeEx()
  • PyEval_EvalFrameEx()
  • PyEval_MerageCompileFlags()
  • Py_eval_input
  • Py_file_input
  • Py_single_input
  • struct PyCompilerFlags
    这几个函数没看懂 /(ㄒoㄒ)/~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值