我正在使用pybind11将用c++编写的库导出为python模块。我的情况可能有点不寻常,因为c++库已经包含了我想要导出的类的所有元数据的结构。我正在考虑是否可以利用现有的元数据,而不是重新输入所有元数据来创建pybind11绑定。
普通的pybind11代码可能看起来像这样;
namespace py = pybind11;
PYBIND11_MODULE(pet, m) {
py::class_<Pet>(m,"Pet")
.def("feed", &Pet::feed, "Feed the pet")
.def("walk", &Pet::walk, "Walk the pet");
}
我正在考虑做一些类似的事情;
namespace py = pybind11;
PYBIND11_MODULE(pet, m) {
py::class_<Pet> pet(m,"Pet");
for (int i = 0; i < pet_metadata.num_funcs; i++)
{
auto& md = pet_metadata.func[i];
pet.def(md.name, md.fptr, md.descr);
}
}
做这样的事情有什么表演上的成功吗?我不太了解pybind11在幕后是如何工作的。每次从python调用其中一个绑定函数时,for循环都会运行吗?还是全部都在编译时进行评估?这种方法行得通吗?
如果您深入研究宏,您会发现PYBIND11_MODULE
扩展为从Python加载库时计算的代码。对于其余部分,您的代码看起来应该可以工作。