在C+中嵌入Python+;导入sklearn并在QThread中运行时冻结
我正在处理下面的代码,当我在主线程中运行时,返回正确的打印结果。但是,当我在不同的线程(a在C+中嵌入Python+;导入sklearn并在QThread中运行时冻结,python,qt,scikit-learn,anaconda,qthread,Python,Qt,Scikit Learn,Anaconda,Qthread,我正在处理下面的代码,当我在主线程中运行时,返回正确的打印结果。但是,当我在不同的线程(aQThread类)中运行此函数时,代码冻结在PyRun\u SimpleString函数-打印中,无法达到下面的断点。也没有返回错误。我注意到在导入sklearn函数时会发生这种情况。能否帮助您在QThread类中正确运行它?非常感谢您的帮助 PyObject *moduleMain = PyImport_ImportModule("__main__"); PyRun_SimpleString( "
QThread
类)中运行此函数时,代码冻结在PyRun\u SimpleString
函数-打印中,无法达到下面的断点。也没有返回错误。我注意到在导入sklearn
函数时会发生这种情况。能否帮助您在QThread
类中正确运行它?非常感谢您的帮助
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("hello1"), PyUnicode_FromString("hello2"));
Py_DECREF(moduleMain);
Py_DECREF(func);
Py_DECREF(args);
PS:Python 3.6.1 | Anaconda(64位)4.4.0
编辑:
PyEval_InitThreads();
PyEval_SaveThread();
PyGILState_STATE state = PyGILState_Ensure();
\\ code above
Py_DECREF(moduleMain);
Py_DECREF(func);
Py_DECREF(args);
PyGILState_Release(state);
您确实调用了
PyEval_InitThreads()代码>?也许检查一下这个@Thomas谢谢你的回复。在主线程中调用className->start()之前,我已经尝试过了。不在QThread
类中的run
函数中。@Thomas我也只是在PyImport\u ImportModule
之前对它进行了测试,但没有结果。在从另一个线程调用python之前,您不需要获取gil(),请看这里@Thomas它起作用了,非常感谢!我遵循了你的第一条评论准则(@forman post),这很好。