执行 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 函数的主要内容,如果未能解决你的问题,请参考以下文章

python执行现有(&大)C++代码

在 C++ 中执行存储为字符串的函数

在 C++ 中是不是可以强制执行字符串文字函数参数?

Python可执行对象——execevalcompile

Python可执行对象——execevalcompile

如何在C++中 统计多行文本中的行数、单词数及字符数