2016-03-04 31 views
0

我想從C++代碼調用Python方法,並且我調用的方法將文件名作爲參數返回列表。從C++調用的python方法返回列表

我的示例代碼當前將方法調用的PyObject *結果轉換爲double,但我想將其轉換爲列表。

#include "include.h" 

int main(int argc, char* argv[]) 
{ 
    double answer = 0; 
    PyObject *modname, *mod, *mdict, *func, *stringarg, *args, *result; 

    Py_Initialize(); 

    PyRun_SimpleString("import sys"); 
    modname = PyUnicode_FromString("module"); 
    mod = PyImport_Import(modname); 
    if (!mod) 
    { 
     PyErr_Print(); 
     exit(1); 
    } 

    mdict = PyModule_GetDict(mod); 
    func = PyDict_GetItemString(mdict, "func"); 
    if (!func) 
    { 
     printf("function does not exist\n"); 
    } 

    stringarg = PyUnicode_FromString("test.txt"); 
    args = PyTuple_New(1); 
    PyTuple_SetItem(args, 0, stringarg); 

    result = PyObject_CallObject(func, args); 
    if (result) 
    { 
     answer = PyFloat_AsDouble(result); 
     Py_XDECREF(result); 
    } 
    Py_XDECREF(stringarg); 
    Py_XDECREF(args); 

    Py_XDECREF(mod); 

    Py_XDECREF(modname); 

    Py_Finalize(); 

    return 0; 
    } 

我該如何去做這件事?我見過包裝類的例子來創建作爲參數傳遞的列表對象,但我還沒有看到將返回的值轉換爲列表的示例。

+0

你是什麼意思轉換到一個列表?現在看起來你假設它返回一個'浮動'。你只想得到一個浮點的列表? – Barry

+0

正如我所說的「我的示例代碼當前將PyObject *結果轉換爲雙精度,但我想將其轉換爲列表」。 – Paul

+0

當我要求澄清你的問題時,我的意思並不是要你直接引用我要求澄清的部分。將double轉換爲list對你來說意味着什麼? – Barry

回答

1

您正在尋找的API的List Objects部分:

result = PyObject_CallObject(func, args); 
if (PyList_Check(result)) { 
    // okay, it's a list 
    for (Py_ssize_t i = 0; i < PyList_Size(result); ++i) { 
     PyObject* next = PyList_GetItem(result, i); 
     // do something with next 
    } 
}