亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 pybind11 或 Python C API 編譯和執行 AST

使用 pybind11 或 Python C API 編譯和執行 AST

慕絲7291255 2021-08-05 16:41:00
我想使用 Pybind11 或直接使用 Python C API 將此 Python 代碼轉換為 C++ 代碼:import astcode = "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關于如何正確實現這一目標的任何想法?
查看完整描述

1 回答

?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

我找到了答案,我沒有使用globalsPybind11的函數,而是使用 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());


查看完整回答
反對 回復 2021-08-05
  • 1 回答
  • 0 關注
  • 181 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號