我正在尝试从 python 3.4 扩展访问现有的 C++ 对象。所以我有来自 C++ 的带有 SWIG 绑定(bind)的对象。然后我试图构建一个 C++ python 扩展,我想在其中访问该对象。
我用 python 这样做的原因是因为创建对象的库是一个外部库。所以我使用 python 绑定(bind)生成对象,现在我需要在 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
方法...我遇到了段错误当我尝试访问 Magick::Image
方法时。我在python中使用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
知道为什么我无法访问 Magick::Image
方法吗?
最佳答案
我不是专家,但看起来 img
没有正确初始化。你在documentation中看到以下内容了吗? ?:
Other objects
O (object) [PyObject *] Store a Python object (without any conversion) in a C object pointer. The C program thus receives the actual object that was passed. The object’s reference count is not increased. The pointer stored is not 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);
关于python - 在 python 扩展中操作来自 SWIG 的共享指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23928139/