Я застрял в упаковке 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 отлично работает без буста. Так что это должно быть моей частью, чтобы решить это. В любом случае, спасибо за чтение.