gpt4 book ai didi

python - 通过 C API 从字符串创建和调用 python 函数

转载 作者:太空狗 更新时间:2023-10-29 18:05:06 25 4
gpt4 key购买 nike

是否可以从字符串加载 python 函数,然后使用参数调用该函数并获取返回值?

我正在使用 python C API 从我的 C++ 应用程序中运行 python 代码。我可以使用 PyImport_Import 从文件加载模块,使用 PyObject_GetAttrString 从文件中获取函数对象,然后使用 PyObject_CallObject 调用函数.我想做的是从字符串而不是文件加载模块/函数。是否有一些等同于 PyImport_Import 的东西可以让我向它传递一个字符串而不是一个文件?我需要将参数传递给我正在调用的函数并且我需要访问返回值,所以我不能只使用 PyRun_SimpleString


编辑:

我在打开 PyRun_String 后找到了这个解决方案。我正在创建一个新模块,获取它的字典对象,将其传递给 PyRun_String 以在我的新模块中定义一个函数,然后为新创建的函数获取一个函数对象并调用它通过 PyObject_CallObject,传递我的参数。这是我发现解决我的问题的方法:main.cpp


int main()
{
PyObject *pName, *pModule, *pArgs, *pValue, *pFunc;
PyObject *pGlobal = PyDict_New();
PyObject *pLocal;

//Create a new module object
PyObject *pNewMod = PyModule_New("mymod");

Py_Initialize();
PyModule_AddStringConstant(pNewMod, "__file__", "");

//Get the dictionary object from my module so I can pass this to PyRun_String
pLocal = PyModule_GetDict(pNewMod);

//Define my function in the newly created module
pValue = PyRun_String("def blah(x):\n\tprint 5 * x\n\treturn 77\n", Py_file_input, pGlobal, pLocal);
Py_DECREF(pValue);

//Get a pointer to the function I just defined
pFunc = PyObject_GetAttrString(pNewMod, "blah");

//Build a tuple to hold my arguments (just the number 4 in this case)
pArgs = PyTuple_New(1);
pValue = PyInt_FromLong(4);
PyTuple_SetItem(pArgs, 0, pValue);

//Call my function, passing it the number four
pValue = PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pArgs);
printf("Returned val: %ld\n", PyInt_AsLong(pValue));
Py_DECREF(pValue);

Py_XDECREF(pFunc);
Py_DECREF(pNewMod);
Py_Finalize();

return 0;
}

这是我原帖的其余部分,留给后人:

这是我最初做的:main.cpp:


#include <Python.h>

int main()
{
PyObject *pName, *pModule, *pArgs, *pValue, *pFunc;

Py_Initialize();
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('')");
pName = PyString_FromString("atest");
pModule = PyImport_Import(pName);
Py_DECREF(pName);

if(pModule == NULL)
{
printf("PMod is null\n");
PyErr_Print();
return 1;
}

pFunc = PyObject_GetAttrString(pModule, "doStuff");
pArgs = PyTuple_New(1);
pValue = PyInt_FromLong(4);
PyTuple_SetItem(pArgs, 0, pValue);

pValue = PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pArgs);
printf("Returned val: %ld\n", PyInt_AsLong(pValue));
Py_DECREF(pValue);

Py_XDECREF(pFunc);
Py_DECREF(pModule);

Py_Finalize();

return 0;
}

atest.py:


def doStuff( x):
print "X is %d\n" % x
return 2 * x

最佳答案

Python C API 中的

PyRun_String 可能就是您要查找的内容。请参阅:http://docs.python.org/c-api/veryhigh.html

关于python - 通过 C API 从字符串创建和调用 python 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3789881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com