前几天解决了Windows下面C++调用Python,导入numpy的问题。但是现在又发现,在加载模型的时候,会报线程异常,加载不成功,信息如下 :
b'C:/Users/grake/Desktop/Crab/out/x64/Release/model.pth'
Exception ignored in: 'threading' from 'C:\\Python\\Python36\\lib\\threading.py'>
Traceback (most recent call last):
File "C:\Python\Python36\lib\threading.py", line 1289, in _shutdown
assert tlock.locked()
SystemError: object at 0x000001E5FC0847D8> returned a result with an error set
C++代码如下:
#include
#include
#include "./python/36.8/include/Python.h"
void test()
{
wchar_t home[] = L"C:/Python/Python36";
Py_SetPythonHome(home);
Py_Initialize();
int r = Py_IsInitialized();
if (r == 0)
{
std::cout << "初始化Python环境失败" << std::endl;
Py_Finalize();
return;
}
PyObject* model = PyImport_ImportModule("algorithm");
if (model == nullptr)
{
std::cout << "加载Python文件失败" << std::endl;
PyErr_Print();
Py_Finalize();
return;
}
PyObject* dict = PyModule_GetDict(model);
if (dict == nullptr)
{
Py_DECREF(model);
std::cout << "获取符号字典失败" << std::endl;
Py_Finalize();
return;
}
PyObject* ptr = PyDict_GetItemString(dict, "load_zfmodel");
Py_DECREF(dict);
if (ptr == nullptr)
{
Py_DECREF(model);
std::cout << "获取load_zfmodel失败" << std::endl;
Py_Finalize();
return;
}
std::cout << "成功获取加载接口" << std::endl;
//Py_DECREF(ptr);
PyObject* args = PyTuple_New(1);
PyTuple_SetItem(args, 0, PyBytes_FromString("model.pth"));
PyObject* py_cv_model = PyObject_CallObject(ptr, args);
Py_DECREF(model);
Py_Finalize();
}
int main()
{
std::thread thread([]() {
test();
});
thread.join();
return 0;
}
项目紧急,哪位可以指点迷津?
这个和你描述的很类似,你看看有没帮助!
windows下VS调用Python接口出现assert tlock.locked()错误_Alex-L的博客-CSDN博客
应该是 numpy版本太高了,试试cmd
pip uninstall numpy, pip install numpy==1.16.4
开辟新线程,将python脚本的调用放到新线程中执行
检查python脚本中的文件路径是否正确
检查python脚本中是否使用了if name=="main",因为c++调用的是函数,所以要把if name=="__main__改为def main():,即自己写一个主函数
然后PyObject* pFun= PyObject_GetAttrString(pModule,"main");
用VS的话,先生成exe可执行文件,然后进入Debug文件夹,通过点击运行exe文件,而不是通过VS调试模式F5,去调用py文件。(注意C++代码中导入py文件的路径不要搞错)
c++调用python脚本报错returned a result with an error set_牛了个牛的博客-CSDN博客
使用Py_BEGIN_ALLOW_THREADS和Py_END_ALLOW_THREADS宏
int main()
{
Py_BEGIN_ALLOW_THREADS
std::thread thread([]() {
test();
});
thread.join();
Py_END_ALLOW_THREADS
return 0;
}
numpy版本太高了
问题解决了部分。不能在C++的线程中做加载,需要在Python中创建线程,这样才不会提示线程问题