C++调用Python线程异常

前几天解决了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中创建线程,这样才不会提示线程问题