gpt4 book ai didi

c++ - 使用 boost::python 将 C++ 类实例传递给 python

转载 作者:IT老高 更新时间:2023-10-28 22:59:34 26 4
gpt4 key购买 nike

我有一个库,它创建对象(A 类的实例)并将它们传递给应该能够调用它们的方法的 python 程序。

基本上我有 C++ 类实例,我想从 python 中使用它们。有时应该将该对象传回 C++ 进行一些操作。

我创建了以下包装文件(假设 New 函数在 C++ 代码中的某处被调用):

#include <boost/python.hpp>
#include <iostream>
#include <boost/smart_ptr.hpp>

using namespace boost;
using namespace boost::python;

int calls = 0;

struct A
{
int f() { return calls++; }
~A() { std::cout << "destroyed\n"; }
};

shared_ptr<A> existing_instance;

void New() { existing_instance = shared_ptr<A>( new A() ); }

int Count( shared_ptr<A> a ) { return a.use_count(); }

BOOST_PYTHON_MODULE(libp)
{
class_<A>("A")
.def("f", &A::f)
;

def("Count", &Count);

register_ptr_to_python< shared_ptr<A> >();
}

代码缺少python获取existing_instance的部分.我没有粘贴,但假设我为此目的使用了回调机制。

此代码有效,但我有几个问题:

  1. 在 Count 函数(以及所有其他 C++ 操作函数)中是否可以传递 a像那样,或者最好做一些类似 const shared_ptr<A>& 的事情?在我在 python boost 文档中找到的代码片段中,经常使用引用,但我不明白其中的区别(当然,除了具有更高的引用计数器)。

  2. 这段代码“安全”吗?当我将 existing_instance 传递给 python 时,它的计数器将增加(只有一次,即使在 python 中我制作了对象的更多拷贝,当然)所以 C++ 代码不可能破坏对象,只要 python 持有至少是一个“拷贝”。我对么?我试着玩指针,看来我是对的,我只是想确定一下。

  3. 我想阻止 python 创建 A 的实例。它们只能从 C++ 代码传递。我怎么能做到这一点? 编辑:找到了,我只需要使用 no_init 和不可复制:class_<A, boost::noncopyable>("A", no_init)

最佳答案

boost::python无所不知boost::shared_ptr ,但你需要告诉它 boost::shared_ptr<A>拥有 A 的实例, 你可以通过添加 boost::shared_ptr<A>在模板参数列表中到class_ ,有关此“持有类型”的更多信息是here in the boost documentation .

为了防止从 python 创建实例,您添加 boost::python::no_init到 class_ 构造函数,所以你最终得到:

boost::python::class_< A, boost::shared_ptr<A> >("A", boost::python::no_init)
//... .def, etc
;

一般中,您不应该通过引用传递共享指针,因为如果对共享指针的引用无效,那么共享指针指向的引用也将无效(因为采取共享指针的引用没有增加指向对象的引用计数器)。

通过boost::shared_ptr 绝对安全如果您不更改 return_value_policy .如果您更改在 python 中公开的方法的策略,使其返回对共享指针的引用,那么您可能会导致问题,就像通过 c++ 引用传递共享指针可能会导致问题一样。

(另外,您应该使用 make_shared<A>(...) 而不是 shared_ptr<A>(new A(...))。)

关于c++ - 使用 boost::python 将 C++ 类实例传递给 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3342216/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com