Pybind 11:如何绑定具有指针参数的C++函数?

2024-09-28 19:32:05 发布

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

假设我得到一个如下的函数

void myFunc(int *a){
  a[0]++;
  a[1]++;
}

我尝试将此函数与下面的

#include "pybind11/numpy.h"
#include "pybind11/pybind11.h"

namespace py = pybind11;

PYBIND11_MODULE(pybindtest, m) {
  m.def("myFunc", [](py::array_t<int> buffer){
    py::buffer_info info = buffer.request();
    myFunc(static_cast<int *>(info.ptr));
  });
}

并使用下面的python代码进行测试

import pybindtest

a=[1,2];

pybindtest.myFunc(a);

print(a)

这显示的是[1, 2],而不是[2, 3]。鉴于myFunc是由其他人编写的,因此我不允许更改API。是否可以将此函数绑定到python中?如果是,我做错了什么


Tags: 函数pyinfonumpyincludedefbuffermyfunc
1条回答
网友
1楼 · 发布于 2024-09-28 19:32:05

在python脚本中试试这个

import numpy as np
import pybindtest

a=np.array([1,2], dtype=np.int32);

pybindtest.myFunc(a);

print(a)

问题在于a是一个python列表,而不是一个int数组。默认情况下,pybind11将把列表转换成合适的数组-请参阅docs中关于py::array::forcecast的部分。但这样做会创建一个副本,并在该副本上执行myFunc中的增量

相关问题 更多 >