执行 C++ 中字符串中提供的 Python 函数
Posted
技术标签:
【中文标题】执行 C++ 中字符串中提供的 Python 函数【英文标题】:Execute Python function provided in string in c++ 【发布时间】:2017-03-25 21:40:07 【问题描述】:我正在尝试从字符串创建 Python 函数并执行它。我只是无法弄清楚如何正确执行它。我写的代码没有返回我期望的值,而是一个类型为_PY_NoneStruct
的对象。
string code =
R"(
def test():
return 'hi';
)";
Py_Initialize();
auto main = PyImport_AddModule((char*)"__main__");
auto dict = PyModule_GetDict(main);
auto compiled = Py_CompileString(code.c_str(), "not a file", Py_single_input);
auto func = PyFunction_New(compiled, dict);
auto result = PyObject_CallObject(func, NULL);
这段代码sn -p zu 执行成功需要修改什么?
提前谢谢你。
【问题讨论】:
建议:Python C-Extension 非常混乱。了解如何使用ctypes
。
【参考方案1】:
主要问题是代码
def test():
return 'hi'
实际上并没有返回任何东西——它只是将一个名为test
的函数添加到当前作用域。你真正想做的是运行这个字符串,然后从定义范围的字典中提取test
:
PyObject *dict = NULL,
*run_result = NULL,
*result = NULL;
dict = PyDict_New();
if (!dict) goto done;
run_result = PyRun_String(code.c_str(), Py_file_input, dict, dict);
// the result is not useful to us (probably None)
if (!run_result) goto done;
// get the function from the module
result = PyDict_GetItemString(dict,"test");
Py_XINCREF(result);
done:
Py_XDECREF(dict);
Py_XDECREF(run_result);
return result;
归根结底,result
是一个可调用的对象,就像你所追求的那样。
(更复杂的方法可能涉及编译代码对象,然后使用PyFunction_New
,但对于任何带参数的东西看起来确实很复杂)
【讨论】:
以上是关于执行 C++ 中字符串中提供的 Python 函数的主要内容,如果未能解决你的问题,请参考以下文章