boost python - 如何将原始指针发送到 python 函数>

Posted

技术标签:

【中文标题】boost python - 如何将原始指针发送到 python 函数>【英文标题】:boost python - how to send a raw pointer to a python function> 【发布时间】:2012-06-26 15:33:33 【问题描述】:

我在我的应用程序中嵌入了 python,我想向 python 函数发送一个原始指针,指向我在 C++ 代码中拥有的对象。 我发现如何做到这一点的唯一方法是用 auto_ptrshared_ptr 包装指针,但我不想这样做,因为我不希望 python 代码有任何机会持有对我的代码中的对象。

boost::python 可以做到这一点吗?

【问题讨论】:

看起来***.com/a/5056462/138772 有你的解决方案。 “通过 boost::python::ptr 将对象指针传递给 python。这将阻止 python 解释器进行复制”。 @JAB 不错!把它写成答案,我会接受的。 实际上,我似乎没有仔细研究它/没有正确阅读我复制和粘贴的内容。看起来使用boost::python::ptr 实际上会使悬空引用的可能性更多,根据boost.org/doc/libs/1_49_0/libs/python/doc/v2/ptr.html,“通常,在将指针传递给Python回调时,会复制指针以确保Python 对象从不持有悬空引用。” 【参考方案1】:

如果你有指向某个映射到 Python 的 C++ 对象的原始指针,那么你可以使用适配器以这种方式围绕原始指针创建另一个 Python 对象:

template<typename PtrT>
struct PtrAdapter 
    auto& get(PtrT ptr)   return *ptr; 
;

然后将其设为 Python 映射类型并允许隐式转换:

class_<Cluster<LinksT>*, noncopyable>(typpedName<LinksT>("ClusterPtr", true, true)
, "Raw hierarchy cluster pointer\n")
    .def("__call__", &PtrAdapter<Cluster<LinksT>*>::get,
        return_internal_reference<>(),
        "referenced cluster")
    ;
register_ptr_to_python<Cluster<LinksT>*>();

请注意,引用类型(在本例中为 Cluster&lt;LinksT&gt;)也必须映射到适当的 Python 对象。 那么对于这样的C++代码:

Cluster<LinksT>* cl = clusters.head();
process(cl);
Id cid = cl->id();

你可以使用类似的 Python 代码:

cl = clusters.head()
process(cl)
cid = cl.id()

但是,如果您不需要对指向 C++ 对象的指针进行一些特殊处理,那么使用boost::python::ptr 显然更好。 您还应该考虑这里提到的替代方案:boost::python: howto call a function that expects a pointer?

【讨论】:

以上是关于boost python - 如何将原始指针发送到 python 函数>的主要内容,如果未能解决你的问题,请参考以下文章

返回 boost::shared_ptr 和从返回的原始指针构造 boost::shared_ptr 有啥区别?

如何将原始数据附加到 boost::shared_array<char>?

boost序列化,原始C数组的反序列化

使用 C++ 指针调用 python 函数

动态数组和删除运算符的 boost::python 内存错误

boost::variant 和多态性