是否可以從字符串加載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