在python扩展中操作来自SWIG的共享指针 我试图从Python 3.4扩展访问一个现有的C++对象。所以我有一个来自C++的对象,带有一个SWIG绑定。然后我试图构建一个C++ Python扩展,我想访问这个对象。

在python扩展中操作来自SWIG的共享指针 我试图从Python 3.4扩展访问一个现有的C++对象。所以我有一个来自C++的对象,带有一个SWIG绑定。然后我试图构建一个C++ Python扩展,我想访问这个对象。,python,c++,imagemagick,swig,shared-ptr,Python,C++,Imagemagick,Swig,Shared Ptr,我使用python这样做的原因是,创建对象的库是一个外部库。所以我使用Python绑定来生成对象,现在我需要在C++中访问那个对象。 更清楚地说,我使用的对象是Magick::Image(来自ImageMagick++),我试图将此对象传递给python扩展,然后将图像转换为numpy数据数组 这里的困难在于,我通过共享指针访问Magick::Image对象 因此,在python中,我有以下内容: img=get\u my\u magick\u image() 打印(img) < P>这是我写

我使用python这样做的原因是,创建对象的库是一个外部库。所以我使用Python绑定来生成对象,现在我需要在C++中访问那个对象。 更清楚地说,我使用的对象是
Magick::Image
(来自ImageMagick++),我试图将此对象传递给python扩展,然后将图像转换为numpy数据数组

这里的困难在于,我通过共享指针访问
Magick::Image
对象

因此,在python中,我有以下内容:

img=get\u my\u magick\u image()
打印(img)
< P>这是我写的C++扩展,可以访问代码> Migk::Meime方法,但是我只能访问<代码> SARDYGPTR <代码>方法…当我尝试访问
Magick::Image
方法时,我遇到了一个SEGFULT。我在python中使用
readimg(img)
来调用它

PyObject*readimg(PyObject*self,PyObject*args){
std::tr1::shared_ptr*img;
if(!PyArg_语法元组(args,“O”&img)){
PyErr_SetString(PyExc_TypeError,“参数错误”);
返回0;
}

std::cout我不是专家,但看起来
img
未正确初始化。您在中看到以下内容了吗?:

其他对象

O(对象)[PyObject*] 将Python对象(不进行任何转换)存储在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);
Magick::Image*\u img=NULL;
if(!PyArg_ParseTuple(args,O,&_img)){
PyErr_SetString(PyExc_TypeError,“参数错误”);
返回0;
}
std::tr1::shared_ptrimg(_img);

谢谢,但在python中,我只能访问Magick::Image的共享指针。我看到了文档并尝试了几个解析参数,但都没有成功。你认为我可以使用O&并进行某种转换吗?啊,我明白了,它返回PyObject*。可能是O&的方式。类似这样:
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);