c++类和Python对象
C++ Classes and Python Objects
我有两个抽象的c++类,我在python中公开和派生它们。我试图在c++中提取这些派生对象,并调用其中一个类的一些方法,将另一个类的实例传递给第一个。这些类是这样定义的:
struct A {
std::vector<int> numbers;
virtual void a() = 0;
};
struct B {
virtual void b(const A& a) = 0;
};
我使用boost::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类只是用随机数填充数字数组,B::b
打印这些数字用于调试。
我可以导入它们并将这两个类提取到boost::shared_ptr
s中,没有问题。它们的初始化器中的任何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->b(*pyA)
时,我得到以下错误:
TypeError: No to_python (by-value) converter found for C++ type: A
我做错了什么?如何使用A
的实例调用Python的B::b
的派生?
问题是必须将抽象类声明为boost::noncopyable
。如文档所述:
boost::noncopyable
[sic]禁止复制T实例的to_python转换的自动注册。当T没有可公开访问的复制构造函数时需要。
因此,我们可以将python对象转换为c++实例,但不能将python对象转换为c++实例,这将导致当我们试图这样做时问题中的错误。
答案实际上就在这个问题答案的注释中。
在包装器类中,通过引用而不是通过值传递对象;因此,该类不必转换为python。这使得包装器看起来像这样:
struct B_wrapper : B, py::wrapper<B> {
void b(const A& a) {
this->get_override("b")(boost:ref(a));
}
};
相关文章:
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- Tensorflow对象检测在Python和C++(OpenCV)之间有不同的结果
- 如何将来自 Boost.Python 的map_indexing_suite与自定义而不是标准对象一起使用?
- 将FFMpeg AVFrame对象从C++应用程序流式传输到Python的最佳方法?
- Pybind11:使用 for 循环使用 OpenMP 访问 python 对象
- 了解 Python 中的对象类型
- 从从该抽象类派生的 Python 对象强制转换C++抽象类C++
- 如何创建和使用存储为 c++ 对象的 python 对象?
- 如何将 c++ 类包装到 python 中,以便我可以使用 pybind11 访问其成员的公共方法(成员是一个对象指针)
- 如何为Python Swigged C++对象创建和分配回调函数
- 在 DLL 中嵌入 Python:Py_DECREF列表对象时访问冲突读取位置
- 在C++中运行 python 对象
- 如何将 Python 对象转换为 Cython 扩展类型的 std::vector 并返回?
- 如何将 cv::mat 对象从 python 模块传递到 c++ 函数并返回返回的 cv::mat 类型为对象?
- 在 boost::p ython 中的 python 对象中运行 python 代码
- 添加 swig pythoncode 以在 Python 对象上设置自己的标志
- 通过 Boost Python 在C++对象之间传递共享指针的隔离错误
- C DLL中的Python对象
- 使用 python 胶囊在 cython 和 pybind11 之间传输 c++ 对象
- Boost.Python 返回引用现有 c++ 对象的 python 对象