Я хотел бы перевести этот код Python в код C ++, используя Pybind11 или непосредственно Python C API:
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"))
Вот что я сейчас использую в Pybind11:
#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);
К сожалению, последняя строка кода C ++ вызывает ошибку во время выполнения: SystemError: frame does not exist
.
Я не уверен, что понимаю эту ошибку, я пытался передать globals
и locals
на exec
, проблема не решилась.
РЕДАКТИРОВАТЬ : при прохождении globals
, это говорит: SystemError: <built-in function globals> returned NULL without setting an error
Есть идеи, как этого добиться?