在C+中嵌入Python+;导入sklearn并在QThread中运行时冻结

在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( "

我正在处理下面的代码,当我在主线程中运行时,返回正确的打印结果。但是,当我在不同的线程(a
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),这很好。