python - 在 python 扩展中操作来自 SWIG 的共享指针

标签 python c++ imagemagick swig shared-ptr

我正在尝试从 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/

相关文章:

c++ - 不接受 Int 值

linux - 如何批量调整数百万张图片的大小以适应最大宽度和高度?

Imagemagick 将每条边切掉 30px(宽度和高度可变)

python - 如何在 Python 中对这个元组执行操作并转换为另一个元组?

c++ - 当我告诉它停止时,为什么程序会继续运行?

python - 用 uuid 替换整数 id 字段

C++11 初始化列表 + 函数指针让我头疼

animation - 使用 imagemagick 制作动画 gif,它放大我的图像并将每一帧放在角落

Python多处理池一些进程在 fork 时处于死锁状态,但在生成时运行

python - Codeforces 不接受我的输出,即使它看起来完全一样?