0

当我的 exe 在 python 脚本完成后退出时,我得到一个指向crt0dat.c 在此处输入图像描述的错误点这样 的调用堆栈...... 在此处输入图像描述 我的 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

对不起我的英语不好...

4

1 回答 1

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);

然而,崩溃可能是由于其他原因(这取决于您正在使用的函数的记录行为)。

于 2012-05-03T05:10:51.377 回答