我正在尝试从字符串创建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);
此代码段zu需要更改哪些内容才能成功执行?
提前谢谢。
答案 0 :(得分:0)
主要问题是代码
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
,但对于任何带参数的东西,它看起来真的很复杂)