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_ptr
或 shared_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<LinksT>
)也必须映射到适当的 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>?