pybind11:将c++类(具有现有的python绑定)返回到python

2024-06-25 05:53:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图为一个c++方法创建一个包装器,该方法返回一个来自外部c++库(vtk)的c++类(vtkPolyData)。同一个库有python绑定,它已经安装在python环境中了。如何告诉pybind c++类(vtkPolydata)及其python变体是相同的?在

我试着用这个custom type caster macro。但是我得到了类型错误:Unable to convert function return value to a Python type! The signature was : (self: Versa3dLib.skeletonizer, offset distance: float) -> vtkPolyData

这是令人困惑的,因为看起来转换映射到正确的类型,但是python无法解释它。所以我不确定出了什么问题,因为我也没有看到宏有任何错误。我注意到在python中vtkPolyData有vtkCommonDataModelPython.vtkPolyData类型。这就是为什么转换不正确吗?在

#include "skeletonizer.h"
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include "PybindVTKTypeCaster.h"
#include <vtkSmartPointer.h>

namespace py = pybind11;

PYBIND11_VTK_TYPECASTER(vtkPolyData)
PYBIND11_DECLARE_HOLDER_TYPE(T, vtkSmartPointer<T>);

namespace pybind11 { namespace detail {
    template <typename T>
    struct holder_helper<vtkSmartPointer<T>> { // <-- specialization
        static const T *get(const vtkSmartPointer<T> &p) { return p.GetPointer(); }
    };
}}

PYBIND11_MODULE(Versa3dLib, m)
{
    py::class_<skeletonizer>(m, "skeletonizer")
        .def(py::init<vtkPolyData *>())
        .def("get_offset", &skeletonizer::get_offset,
             "return vtkPolyData offset",
             py::arg("offset distance"));
}

骨骼化器

^{pr2}$

骨骼化器cpp

#include "skeletonizer.h"


skeletonizer::skeletonizer(vtkPolyData* data)
{
};

vtkSmartPointer<vtkPolyData> skeletonizer::get_offset(double dist)
{
    vtkSmartPointer<vtkPolyData> offsets = vtkSmartPointer<vtkPolyData>::New();

    return offsets;
};

Tags: 方法py类型getreturnincludetype错误
1条回答
网友
1楼 · 发布于 2024-06-25 05:53:45

我认为这应该是一个更通用的解决方案(希望更容易使用?)公司名称:

我认为这应该是对VTK代码的改进:

  • 使用SFINAE泛化类型转换程序(而不是需要显式实例化…)。在
  • 允许直接强制转换vtkSmartPointervtkNew(假设其中的类型是VTK类型)。在

使代码遵循Drake's C++ + Python binding conventions。在

对于上面的解决方案,我认为它很好地利用了SMTK代码,但是holder类型的实例化是不正确的-您需要对智能指针进行type_caster专门化(我发布的vtk_pybind代码将提供这一点)。在

我会看看我是否可以在SMTK上发布一个问题,看看他们是否想改进/简化他们的绑定代码(特别是如果人们引用它的话!)。在

编辑:已在此处发布问题:https://gitlab.kitware.com/cmb/smtk/issues/228

相关问题 更多 >