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
中执行增量。
假设我得到一个如下所示的函数
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
中执行增量。