Ускоренный процесс Python умирает при удалении или освобождении массива - PullRequest
0 голосов
/ 06 ноября 2019

Я застрял в упаковке C dll с python. На стороне dll предусмотрен черный ящик и я сделал дополнительный класс оболочки. Python дает C dll numpy ndarray. затем C dll обрабатывает и возвращает его.

Когда я удаляю массив в C, вся программа умирает. с или без глубокой копии. ниже приведен краткий код для воспроизведения

Python Main

import mypyd, numpy

myobject = mypyd.myimpro()
image = readimg()    #ndarray
result = myobject.process(image) <- process die here with exit code -1073741819

dllmain header

BOOST_PYTHON_MODULE(mypyd){
    class_<mywrapclass>("myimpro")
        .def("process", &mywrapclass::process)
}

c заголовка оболочки

namespace np = boost::python::numpy;

class mywrapclass{
    dllhandler m_handler;
    myimagestruct process(np::ndarray);
}

c кода оболочки

mywrapclass::mywrapclass(){
    Py_Initialize();
    np::initialize();
    m_handler = initInDLL()
}

np::ndarray mywrapclass::process(np::ndarray input){
    myimagestruct image = ndarray2struct(input); ## deep copy data array
    myimagestruct result = processInDLL(m_handler, image);
    np::ndarray ret = struct2ndarray(result); ## also deep copy data array. just in case.
    return ret;
}

c заголовок для dll (я не могу изменить этот код. Он дается с помощью dll)

typedef struct {
    void *data
    ... size, type etc
} myimagestruct;

typedef void * dllhandler;

dllhandler = initInDLL();
myimagestruct processInDLL(myimagestruct);

извините за неправильный код. Изначально я наивно думал, что boost.python или глубокое копирование решат эту проблему с кучей памяти, смеется. Перепробовал почти все ключевые слова в моем мозгу, но даже не смог найти какой-либо смысл для начала.

dll отлично работает без буста. Так что это должно быть моей частью, чтобы решить это. В любом случае, спасибо за чтение.

...