使用pybind11或Python C API编译并执行AST

时间:2018-11-02 09:07:14

标签: python c++ abstract-syntax-tree python-c-api pybind11

我想使用Pybind11或直接将Python C API将此Python代码转换为C ++代码:

mat-grid-tile

这是我目前使用的Pybind11:

import ast

code = "print('Hello World!')"

code_ast = ast.parse(code, mode="exec") # "code" being a string containing code
# ... perform some modifications on "code_ast"
exec(compile(code_ast, filename="<ast>", mode="exec"))

不幸的是,C ++代码的最后一行引发了运行时错误:#include <iostream> #include "pybind11/embed.h" namespace py = pybind11; std::string code = "print('Hello World!')"; py::module ast = py::module::import("ast"); py::module builtins = py::module::import("builtins"); py::object code_ast = ast.attr("parse")(code, "<unknown>", "exec"); // ... perform some modifications on "code_ast" py::object compiled_code = builtins.attr("compile")(code_ast, "<ast>", "exec"); builtins.attr("exec")(compiled_code);

我不确定我是否理解此错误,我尝试将SystemError: frame does not existglobals传递给locals,但这并不能解决问题。

编辑:通过exec时,它说:globals

关于如何正确实现此目标的任何想法?

1 个答案:

答案 0 :(得分:0)

我找到了答案,我没有使用Pybind11的globals函数,而是Python(builtins.attr("globals")())的内置函数。

这是工作版本:

py::module ast = py::module::import("ast");
py::module builtins = py::module::import("builtins");

py::object code_ast = ast.attr("parse")(code, "<unknown>", "exec");
// ... perform some modifications on "code_ast"
py::object compiled_code = builtins.attr("compile")(code_ast, "<ast>", "exec");
builtins.attr("exec")(compiled_code, py::globals());