在c ++中执行string中提供的Python函数

时间:2017-03-25 21:40:07

标签: python c++ python-3.x python-c-api python-c-extension

我正在尝试从字符串创建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需要更改哪些内容才能成功执行?

提前谢谢。

1 个答案:

答案 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,但对于任何带参数的东西,它看起来真的很复杂)