我试图从python 3.4扩展访问现有的C ++对象。所以我的对象来自C ++,带有SWIG绑定。然后我尝试构建一个C ++ python扩展,我想访问该对象。
我使用python执行此操作的原因是因为创建对象的库是外部库。所以我使用python绑定生成对象,现在我需要在C ++中访问该对象。
为了更清楚我使用的对象是Magick::Image
(来自ImageMagick ++),我试图将此对象传递给python扩展,然后将图像转换为numpy ndarray。
这里遇到困难,我通过共享指针访问Magick::Image
对象。
所以在python中我有这个:
img = get_my_magick_image()
print(img)
<Swig Object of type 'std::tr1::shared_ptr< Magick::Image > *' at 0x7f32f6ecdd80>
这是我写的能够访问Magick::Image
方法的C ++扩展,但我只能访问shard_ptr
方法...当我尝试访问{{1时,我遇到了段错误}} 方法。我在python中使用Magick::Image
来调用它。
readimg(img)
相关输出:
PyObject* readimg(PyObject* self, PyObject* args) {
std::tr1::shared_ptr< Magick::Image > * img;
if (!PyArg_ParseTuple(args, "O", &img)) {
PyErr_SetString(PyExc_TypeError, "error with parameters");
return 0;
}
std::cout << "img : " << img << std::endl;
std::cout << "&img : " << &img << std::endl;
std::cout << "typeid(img).name() : " << typeid(img).name() << std::endl;
std::cout << "typeid((*img)).name() : " << typeid((*img)).name() << std::endl;
std::cout << "img->use_count()" << img->use_count() << std::endl;
std::cout << "img->unique()" << img->unique() << std::endl;
std::cout << "img->get()" << img->get() << std::endl;
std::cout << "(*img).use_count()" << (*img).use_count() << std::endl;
std::cout << "(*img)" << (*img) << std::endl;
Magick::Geometry size = (*img)->size(); // SEGFAULT HERE
unsigned h = size.height();
std::cout << h << std::endl;
}
知道为什么我无法访问img : 0x7f32f6ecdd80
&img : 0x7fff280fbad8
typeid(img).name() : PNSt3tr110shared_ptrIN6Magick5ImageEEE
typeid((*img)).name() : NSt3tr110shared_ptrIN6Magick5ImageEEE
img->use_count() : 10296384
img->unique() : 0
img->get() : 0x2
(*img).use_count() : 10296384
(*img) : 0x2
Segmentation fault
方法吗?
答案 0 :(得分:1)
我不是专家,但看起来img
未正确初始化。您在documentation中看到了以下内容吗?:
其他对象
O(对象)[PyObject *] 在C对象指针中存储Python对象(不进行任何转换)。因此,C程序接收到的实际对象 通过。对象的引用计数不会增加。指针 stored不是NULL。
该函数存储原始C指针,所以我认为它与共享指针不兼容。 如果你需要一个共享指针,那么我会建议这样的事情:
Magick::Image* _img = NULL;
if (!PyArg_ParseTuple(args, "O", &_img)) {
PyErr_SetString(PyExc_TypeError, "error with parameters");
return 0;
}
std::tr1::shared_ptr< Magick::Image > img(_img);