2012-05-03 61 views
0

當我的exe文件的python腳本完成後退出,我得到了一個錯誤點crt0dat.c enter image description here 調用堆棧是這樣的... enter image description here 是否有一些錯誤我的C++代碼或在Python代碼?退出異常與C++調用Python腳本失敗

的C++代碼:

void PythonCall::call(std::vector<double>& s,std::vector<double>& b,std::vector<double>& t,std::vector<double>& y) 
{ 

    PyObject* args = PyTuple_New(2); 
    PyObject* tPyList = convert2PythonList(t); 
    PyObject* yPyList = convert2PythonList(y); 
    PyTuple_SetItem(args,0,tPyList); 
    PyTuple_SetItem(args,1,yPyList); 

    PyObject* r = PyObject_CallObject(func,args); 

    PyObject* item; 


    PyObject* iter = PyObject_GetIter(r); 
    /*{ 
    PyObject *errtype, *errvalue, *traceback; 
    PyErr_Fetch(&errtype, &errvalue, &traceback); 
    PyObject *s = PyObject_Str(errvalue); 
    char *errstr = PyString_AsString(s); 
    std::cout << "Python Error: " << errstr; 
    }*/ 


    item = PyIter_Next(iter); 
    int i = 0; 
    PyObject* iter2 = PyObject_GetIter(item); 
    PyObject* item2; 
    while (item2 = PyIter_Next(iter2)) 
    { 
     s[i] = PyFloat_AsDouble(item2); 
     Py_XDECREF(item2); 
     i++; 
    } 
    Py_XDECREF(item); 
    //Py_XDECREF(iter2); 

    item = PyIter_Next(iter); 
    i = 0; 
    iter2 = PyObject_GetIter(item); 
    while (item2 = PyIter_Next(iter2)) 
    { 
     b[i] = PyFloat_AsDouble(item2); 
     Py_XDECREF(item2); 
     i++; 
    } 
    Py_XDECREF(item); 
    //Py_XDECREF(iter2); 

    //Py_XDECREF(iter); 
    Py_XDECREF(args); 
    Py_XDECREF(r); 
    Py_XDECREF(item); 
    Py_XDECREF(tPyList); 
    Py_XDECREF(yPyList); 
    //std::cout << "done" << std::endl; 
} 

和Python代碼:

def get_slope_baseLine(tl,xl): 
    slopes = get_slope2(tl,xl) 
    baselines = get_leakTime(tl,slopes) 
    return slopes,baselines 

對不起我的英文不好...

+7

你能發表任何代碼嗎?很難調試不可見的代碼。 – Blender

+2

你如何期望我們知道如果你不給我們你的C++,或你的Python代碼? – mfontanini

+1

'doexit()'很可能被調用,因爲程序因訪問衝突或其他終止條件而終止。那是什麼,完全取決於C++或Python代碼正在做什麼。我第二次評論前兩條 - 僅僅通過查看程序終止的事實,無法知道發生了什麼。 –

回答

3

顯然你打算遍歷了兩個列出和減少它們元素的參考計數,但是你忘記重置iter,所以你沒有迭代第二個列表。

PyObject* iter = PyObject_GetIter(r); 

item = PyIter_Next(iter); 
int i = 0; 
PyObject* iter2 = PyObject_GetIter(item); 
PyObject* item2; 
while (item2 = PyIter_Next(iter2)) 
{ 
    s[i] = PyFloat_AsDouble(item2); 
    Py_XDECREF(item2); 
    i++; 
} 
Py_XDECREF(item); 

// ! Here you probably intended another call to PyObject_GetIter 
item = PyIter_Next(iter); 
i = 0; 
iter2 = PyObject_GetIter(item); 
while (item2 = PyIter_Next(iter2)) 
{ 
    b[i] = PyFloat_AsDouble(item2); 
    Py_XDECREF(item2); 
    i++; 
} 
Py_XDECREF(item); 

但是,崩潰可能是由於其他原因(它取決於您正在使用的函數的記錄行爲)。

+0

+1,waaaay更好。 :) – HostileFork

+1

非常感謝,我找到了原因。我這樣做Py_XDECREF(項目)三次....但我只有兩個名單 – wtm

+0

@wtm如果您的問題是由某人給你的信息解決,請確保你「接受「答案......這就是StackOverflow上的禮儀...... – HostileFork

相關問題