python - 使用 pybind11 或 Python C API 编译和执行 AST
问题描述
我想使用 Pybind11 或直接使用 Python C API 将此 Python 代码转换为 C++ 代码:
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
and传递locals
给exec
,但没有解决问题。
编辑:通过时globals
,它说:SystemError: <built-in function globals> returned NULL without setting an error
关于如何正确实现这一目标的任何想法?
解决方案
我找到了答案,我没有使用 Pybind11 中的函数,而是 Python ( )globals
中的内置函数。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());
推荐阅读
- typescript - 部署后本地运行HTTP功能时无法访问存储文件
- ruby-on-rails - 使用 rspec rails 测试 JSON 响应
- javascript - 在 Ruby on Rails 应用程序中使用 javascript 插件
- kubernetes-helm - ingress.yaml 模板在渲染中返回错误 --> nil 指针评估接口 {}.service
- python - 如何按组选择随机索引?
- javascript - JavaScript - Console.log 返回一些东西,但返回它显示未定义
- ios - 如何在 UITableViewController 中使用段控制器设置导航栏标题?
- pandas - 将带有 NAT 条目的 pandas 日期时间字段转换为日期
- excel - 从 vba 中的 syslog 文件中提取数据
- maven - 多模块本地 jar 依赖项 - Jenkins Pipeline