Не загружает модуль в с++ написанный на питоне

Есть код на python, который я использую в с++ с помощью pybind11

testmodul.py

import numpy as np

def test(x, height, width):
    img = np.resize(x, [height, width, 3])
    img = 255 - img
    return img.flatten().astype("uint8")

он используется в плагине, который загружается в основное приложение. в инит ф-ии плагина вызываю

pybind11::initialize_interpreter(); 

в дестрой ф-ии:

pybind11::finalize_interpreter();

основной код:

pybind11::array_t<unsigned char> py_arr(length);
auto py_arr_buffer = py_arr.request();
unsigned char* py_arr_ptr = (unsigned char*)py_arr_buffer.ptr;
std::memcpy(py_arr_ptr, inp, length * sizeof(unsigned char));
try {
    auto testmodul = pybind11::module::import("testmodul");
    auto test = testmodul.attr("test");
    pybind11::array_t<unsigned char> result_add = test(py_arr, height, width);
    std::memcpy(out, result_add.data(), length * sizeof(unsigned char));
}
catch (pybind11::error_already_set& ex)
{
    std::string error = std::string(ex.what());
    *out = *inp;
    return -1;
}

первый раз все отрабатывает. но, плагин выгружается и загружается по новой. Заново отрабатывают initialize/finalize но падает на строке

auto testmodul = pybind11::module::import("testmodul");

это все во второй раз. Впервый раз все работает как надо

введите сюда описание изображения

NOTE: проблему решил. Создал глобальную переменную

pybind11::scoped_interpreter* guard = nullptr;

и выделяю память в отдельной ф-ии, если !guard (потому что не мог инициилизировать в dllmain случался дедлок, не знаю почему) а в диструкторе dllMain(да, именно в нем) вызываю

delete guard

вот такой костыльный подход я использовал


Ответы (0 шт):