2

pybind11用来访问一些我在 python 中用 C++ 编写的函数。我希望将初始化的结构实例返回给 python(从类成员函数),以便我可以访问 python 中的实例值。我提供了我的源文件的简化版本。可以使用以下内容重现错误。这是 C++ 包装器

#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include "sum.h"
namespace py = pybind11;

PYBIND11_PLUGIN(GetSum) {

py::module mod("GetSum", "wrapping caltri");

mod.def("get_instance", &GetSum::get_instance, py::return_value_policy::copy, "get instance of out");

py::class_<GetSum, std::shared_ptr<GetSum>>(mod, "GetSum") 
  .def(py::init<>())
  .def("input", &GetSum::input);

return mod.ptr();
}

这是类头的一部分sum.h

   extern "C" {
#include "mesh.h"
}
#include<iostream>
#include<vector>

class GetSum {
 struct A out;

 public:
  GetSum();
  void input(std::vector<float>);
  struct A get_instance() {   
   return out; };  
  ~GetSum();

};

这是类定义 sum.cpp

#include "sum.h"

GetSum::GetSum() {
 out.pointlist = nullptr;
}
void GetSum::input(std::vector<float> num){ 
  out.pointlist = new float[num.size()];   
  for(size_t i = 0; i < num.size(); i++) 
      *(out.pointlist+i) = num[i]; 
}

GetSum::~GetSum(){
  delete [] out.pointlist;
}

结构定义:mesh.h

#include <stdio.h>

struct A {
 float *pointlist;
};

这就是我在 python 中调用它的方式。

import GetSum
m = GetSum.GetSum()
m.input([1.0,2.0])
GetSum.s = GetSum.get_instance()

之后我得到错误:get_instance():不兼容的函数参数。支持以下参数类型: 1. (arg0: GetSum) -> A

有人可以帮我找出我可能出错的地方吗?

谢谢!

4

1 回答 1

2

您需要在struct Apybind11 中声明它才能用作返回类型,方法是至少添加:

py::class_<A>(mod, "A")
  .def(py::init<>());

到你的包装代码。此外,由于get_instance不是静态的,因此您需要在示例 python 代码中按如下方式调用它:

GetSum.s = GetSum.get_instance(m)
于 2019-11-17T23:21:14.043 回答