我有一个返回原始float
指针的 C++ 函数,以及另一个接受原始float
指针作为参数的 C++ 函数。就像是:
float* ptr = something;
float* get_ptr(void) { return ptr; }
void use_ptr(float* ptr) { do_work(ptr); }
我希望能够使用 Python 传递指针。像这样的东西:
import my_native_functions as native
ptr = native.get_ptr()
native.use_ptr(ptr)
我正在使用 pybind11 创建我的本机 python 模块,但我不知道如何为该get_ptr()
函数创建绑定。如果我只是执行以下操作:
PYBIND11_MODULE(my_native_functions, m)
{
m.def("get_ptr", &get_ptr);
m.def("use_ptr", &use_ptr);
}
该get_ptr()
函数返回一个 PythonFloat
对象。我想这是有道理的,因为 python 中没有指针类型。但是,因为现在这是一个简单的Float
,所以当我调用use_ptr()
函数并在 C/C++ 中迭代指针时,只有数组的第一个元素是正确的。其余都是垃圾。为了解决这个问题,在 C++ 中,我必须将指针转换为 / 从std::size_t
. 通过这样做,一切正常。
但是,我想问一下:是否有一种“正确的方法”可以在不std::size_t
使用 pybind11 进行转换的情况下实现上述目标?
如果你好奇我为什么这样做:我明白我所做的不是类型安全的。此外,我从不触摸 Python 端的指针/整数。我只是从一个本机模块中检索它并将其传递给另一个。此外,我不能将指针转换为某种 numpy 视图,因为指针并不总是在 CPU 上。有时我想传递 CUDA 指针。py::array_t
除非我复制数据(而且我不想这样做),否则不可能从 CUDA 指针创建一个。
谢谢你。