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

Pybind 11: How to bind C++ function that has pointer arguments?

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

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?如果是,我做错了什么?

在您的 python 脚本中试试这个

import numpy as np
import pybindtest

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

pybindtest.myFunc(a);

print(a)

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