CannibalChief 2022-10-28 15:13 采纳率: 50%
浏览 114
已结题

C++调用Python线程异常

前几天解决了Windows下面C++调用Python,导入numpy的问题。但是现在又发现,在加载模型的时候,会报线程异常,加载不成功,信息如下 :

b'C:/Users/grake/Desktop/Crab/out/x64/Release/model.pth'
Exception ignored in: <module '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: <built-in method locked of _thread.lock object at 0x000001E5FC0847D8> returned a result with an error set

C++代码如下:

#include <iostream>
#include <thread>
#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;
}

项目紧急,哪位可以指点迷津?

  • 写回答

7条回答 默认 最新

  • 游一游走一走 2022-10-28 15:33
    关注
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月31日
  • 创建了问题 10月28日