Я пытаюсь создать функцию 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);
Что нужно изменить, чтобы этот фрагмент кода был успешно выполнен?
Заранее спасибо.
Основная проблема заключается в том, что код
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
но это действительно выглядит довольно сложно для чего-либо с аргументами)
Других решений пока нет …