调用Py_Finalize返回断言错误

时间:2018-07-10 14:13:08

标签: python multithreading qt qthread

我正在尝试从c ++调用python代码,并且正在使用以下QThread类。

myclassName::myclassName() 
{
    Py_Initialize();
}
myclassName::~myclassName()
{
    Py_Finalize();
}

void myclassName::cpp_wrapper(string out1, string out2){

    ThreadState = PyEval_SaveThread();
    GILState = PyGILState_Ensure();

    Py_DECREF(PyImport_ImportModule("threading"));

    PyObject *moduleMain = PyImport_ImportModule("__main__");
    PyRun_SimpleString(
        "def wrapper(arg1, arg2) :          \n"\
        "   import sklearn                  \n"\
        "   print(arg1, arg2)               \n"\
        );
    PyObject *func = PyObject_GetAttrString(moduleMain, "wrapper");
    PyObject *args = PyTuple_Pack(2, PyUnicode_FromString(out1.c_str()), PyUnicode_FromString(out1.c_str()));

    Py_DECREF(moduleMain);
    Py_DECREF(func);
    Py_DECREF(args);

    PyGILState_Release(GILState);
    PyEval_RestoreThread(ThreadState);
}
void myclassName::run()
{
    algorithm_wrapper("Hello1", "Hello2");
    //here a sginal is emmited to the main thread function to delete myclassName* item.
}

int main(){
    myclassName* item = new myclassName();
    item->run();
}

执行很好(由于上一篇文章中的@Thomas),但是调用Py_Finalize时会返回以下错误。当执行python代码并将信号发送到主线程中的插槽以删除类对象时,将调用Py_Finalize。我还尝试在主线程中初始化和完成python的定义(同样通过发送信号),但是返回了相同的错误。

Exception ignored in: <module 'threading' from 'C:\\Users\\username\\AppData\\Local\\Continuum\\Anaconda3\\Lib\\threading.py'>
Traceback (most recent call last):
  File "C:\Users\username\AppData\Local\Continuum\Anaconda3\Lib\threading.py", line 1289, in _shutdown
    assert tlock.locked()

您能提供一些帮助吗?

1 个答案:

答案 0 :(得分:1)

如Python官方网站中所述,有关Py_Finalize:

“错误和警告:破坏模块和模块中的对象的顺序是随机的;这可能会导致析构函数( del ()方法)依赖于其他对象(甚至函数)而失败)或模块。不会卸载由Python加载的动态加载的扩展模块。可能无法释放Python解释器分配的少量内存(如果发现泄漏,请报告)。释放。扩展模块分配的某些内存可能无法释放。某些扩展如果多次调用其初始化例程,则可能无法正常工作;如果应用程序多次调用Py_Initialize()和Py_Finalize(),则可能会发生这种情况。” >

因此,您可以在调用Py_Finalize之前手动完成广告处理资源和流程的确定