【问题标题】:C++ Classes and Python Objects [duplicate]C ++类和Python对象[重复]
【发布时间】:2015-07-15 18:08:14
【问题描述】:

我有两个在 python 中公开和派生的抽象 C++ 类。我试图在 C++ 中提取这些派生对象并调用其中一个类的某些方法,将另一个类的实例传递给第一个类。这些类是这样定义的:

struct A {
    std::vector<int> numbers;

    virtual void a() = 0;
};

struct B {
    virtual void b(const A& a) = 0;
};

我使用 boost::python 将它们暴露给 Python

namespace py = boost::python;

struct A_wrapper : A, py:wrapper<A> {
    void a() {
        this->getoverride("a")();
    }
};

struct B_wrapper : B, py::wrapper<B> {
    void b(const A& a) {
        this->get_override("b")(a);
    }
};

BOOST_PYTHON_MODULE(example) {
    typedef std::vector<int> int_vec_t;

    py::class_<int_vec_t>("IntList")
        .def(py::vector_indexing_suite<int_vec_t>());

    py::class_<A_wrapper, boost::noncopyable>("A")
        .def_readwrite("numbers", &A::numbers)
        .def("a", py::pure_virtual(&A::a));

    py::class_<B_wrapper, boost::noncopyable>("B")
        .def("b", py::pure_virtual(&B::b));
}

我的 python 类只是用随机数填充 numbers 数组,B::b 打印这些数字用于调试目的。

我可以毫无问题地导入它们并将这两个类提取到boost::shared_ptrs。甚至会调用其初始化程序中的任何 python 代码。

auto pyA = py::extract<boost::shared_ptr<A> >(/*py object containing derivation of A*/)();
auto pyB = py::extract<boost::shared_ptr<B> >(/*py object containing derivation of B*/)();

但是当我尝试拨打 pyB-&gt;b(*pyA) 时,我收到以下错误:

TypeError: No to_python (by-value) converter found for C++ type: A

我做错了什么?如何使用A 的实例调用Python 对B::b 的派生?

【问题讨论】:

    标签: python c++ boost-python


    【解决方案1】:

    问题是必须将抽象类声明为boost::noncopyable。正如documentation 所说:

    boost::noncopyable [原文如此] 禁止自动注册复制 T 实例的 to_python 转换。当 T 没有可公开访问的复制构造函数时需要。

    所以我们可以将 python 对象转换为 C++ 实例,但反之则不行,这会在我们尝试这样做时导致问题中的错误。

    解决方案其实就在this问题答案的cmets中。

    wrapper类中,通过引用而不是通过值传递对象;所以类不必转换为python。这使包装器看起来像这样:

    struct B_wrapper : B, py::wrapper<B> {
        void b(const A& a) {
            this->get_override("b")(boost:ref(a));
        }
    };
    

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 1970-01-01
      • 2019-04-28
      • 2011-06-20
      • 1970-01-01
      • 2016-05-28
      • 2020-08-29
      • 2019-04-10
      • 1970-01-01
      相关资源
      最近更新 更多