是否可以从字符串加载python函数,然后使用参数调用该函数并获取返回值?通过C API从字符串创建并调用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
这是没有必要离开你的职位后代。堆栈溢出已涵盖。所有对问题和答案的编辑都会自动存档,一旦我们的积分达到一定水平,我们就可以看到。这有助于我们回滚不良编辑,并追踪更改以更好地理解问题。所以,不要把它放在那里,你可以删除你的改变,如果需要的话,我们可以看看编辑日志。因此,甚至没有必要输入“编辑:”。 – 2015-01-14 20:02:55