将Python源代码作为字符串嵌入C++

enxuqcxy  于 2022-12-01  发布在  Python
关注(0)|答案(1)|浏览(162)

我正在编写一个C程序,需要将Python(3.11)代码嵌入其中,我使用Python.h来尝试并完成这一点。总体思路是,我的Python脚本将包含一个"main()"函数,它将返回一个已知大小的数组,因为我将在运行时对源代码执行操作,所以它将被C程序存储为字符串。
我知道我可以通过以下方式做到:

...
PyObject *pName = PyString_FromString("main");
PyObject *pModule = PyImport_Import(pName)
...

然而,为了真正执行脚本,我需要将它写入一个文件,以便python可以再次读取它。这增加了额外的执行时间,我宁愿避免。有没有什么方法可以将源代码作为字符串直接传递给python,然后从那里开始工作?或者我只是被搞砸了?
编辑:顺便说一句,PyRun_SimpleString没有做我想要的事情,因为它没有从执行的代码中返回任何东西。

taor4pac

taor4pac1#

在评论中找到了答案,感谢nick。PyRun_String的用法示例:https://schneide.blog/2011/10/10/embedding-python-into-cpp/,并从python脚本中提取列表变量https://docs.python.org/3/c-api/list.html最后的科学怪人:

PyObject *main = PyImport_AddModule("__main__");
PyObject *globalDictionary = PyModule_GetDict(main);
PyObject *localDictionary = PyDict_New();
PyRun_String("a=[0, 1, 2, 3, 4, 5]", Py_file_input, globalDictionary, localDictionary);
    
PyObject *result = PyDict_GetItemString(localDictionary, "a");

double a[6];
for (int i = 0; i < PyList_Size(result); i++) {
    a[i] = PyFloat_AsDouble(PyList_GetItem(result, i));
}

相关问题