Выполнить функцию Python в строке в переполнении стека

Я пытаюсь создать функцию 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);

Что нужно изменить, чтобы этот фрагмент кода был успешно выполнен?

Заранее спасибо.

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 но это действительно выглядит довольно сложно для чего-либо с аргументами)

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]