我试图从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(同样通过发送信号),但是返回了相同的错误。在
你能帮忙吗?在
正如Python官方网站上提到的Py_Finalize:
“错误和警告:模块中的模块和对象的销毁是以随机顺序进行的;这可能会导致析构函数(del()方法)依赖于其他对象(甚至函数)或模块时失败。由Python加载的动态加载的扩展模块不会被卸载。Python解释器分配的少量内存可能无法释放(如果发现泄漏,请报告它)。对象之间循环引用所占用的内存不会被释放。扩展模块分配的一些内存可能无法释放。如果多次调用某些扩展的初始化例程,则可能无法正常工作;如果应用程序多次调用Py_Initialize()和Py_Finalize(),则可能会发生这种情况。”
因此,您需要在调用Py嫒finalize之前手动完成ad dispose资源和进程
相关问题 更多 >
编程相关推荐