在python扩展中操作来自SWIG的共享指针
Manipulate a shared pointer coming from SWIG in python extension
我试图从python 3.4扩展访问现有的c++对象。所以我有了一个带有SWIG绑定的c++对象。然后我试图建立一个c++ python扩展,我想访问该对象。
我在python中这样做的原因是因为创建对象的库是一个外部库。因此,我使用python绑定来生成对象,现在我需要在c++中访问该对象。
为了更清楚,我使用的对象是Magick::Image
(来自imagemagick++),我试图将此对象传递给python扩展,然后将图像转换为numpy narray。
这里的难点是,我通过共享指针访问Magick::Image
对象。
在python中我有这个:
img = get_my_magick_image()
print(img)
<Swig Object of type 'std::tr1::shared_ptr< Magick::Image > *' at 0x7f32f6ecdd80>
这是我写的c++扩展,以便能够访问Magick::Image
方法,但我只能访问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
没有正确初始化。您在文档中看到以下内容了吗?:
0 (object) [PyObject *]将Python对象(不进行任何转换)存储在C对象指针中。C程序因此接收到实际的对象过去了。对象的引用计数不会增加。的指针
函数存储原始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);
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 在cuda线程之间共享大量常量数据
- 如何从具有移动语义的类对象中生成共享指针
- 在c代码之间共享数据的最佳方式
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- Python 3.7 和 excess_args 的 SWIG 问题
- 将静态库链接到不带-fPIC的共享库中
- 如何在SWIG的帮助下使用C++Go代码中的共享库?
- 使用 SWIG 初始化对 C# 共享指针的引用,从C++
- SWIG共享_ptr会导致不透明的对象
- SWIG:返回原始指针与共享指针的向量
- SWIG & 辅助共享库 (C++)
- 如何使用 SWIG 在进程和调用的脚本子进程之间共享库
- SWIG和C++共享图书馆
- 在用SWIG编译的c和lua模块之间共享数据指针
- Perl: IPC::可共享和SWIG C++对象不同意
- 在python扩展中操作来自SWIG的共享指针
- 在perl中调试由SWIG封装的共享库
- SWIG:仅使用标头和共享库包装Perl的C++,无法找到可加载对象错误