我试图在python中使用一个以指针作为参数的c++函数。对于facade,我在python中使用pybind11和ctype来创建指针。
但是,我在python中得到的附加项并不等于c++中的一个。在项目的后面,我确实需要变量的入口,并且我不能通过返回来获得它,因为函数已经返回了其他的东西。
c++函数
void myFunc(double* ptr, double value)
{
*ptr = value;
std::cout << "ptr value:\t\t" << *ptr << std::endl;
std::cout << "ptr adress:\t\t" << ptr << std::endl;
};pybind码
m.def("myFunc",
[](double* ptr,
double value) {
myFunc(ptr, value);
}, "funtion to test stuff out");python代码
ptr_value = ctypes.c_double()
ptr_addressof = ctypes.addressof(ptr_value)
ptr_object_pointer = pointer(ptr_value)
ptr_pointer = ctypes.cast(ptr_object_pointer, ctypes.c_void_p).value
print(f'python ptr using addressof(ptr_value):\t\t{ptr_addressof}')
print(f'python adress using ctypes.cast:\t\t{ptr_pointer}')
print(f'python ptr object using pointer(ptr_value):\t{ptr_object_pointer}')
value = 14.0
myFunc(ptr_addressof, value)输出
python ptr using addressof(ptr_value): 2784493684616
python adress using ctypes.cast: 2784493684616
python ptr object using pointer(ptr_value): <__main__.LP_c_double object at 0x0000028850C1C8C0>
ptr value: 14
ptr adress: 000000CC2D3EE490如何在c++和python中获得相同的入口?
发布于 2022-07-07 11:35:42
我解决了这个问题。这只是我思考过程中的一个错误。Pybind现在看起来像这样
m.def("myFunc",
[](double value) {
void *pointer;
otherValue = myFunc(&pointer, value);
return std::make_tuple(pointer, otherValue);
}, "funtion to test stuff out");请注意,这有点类似于我以前尝试过的东西。我很困惑,因为在python中打印指针变量时的输出是adress xxx中的对象。然而,在python中,adress并不表示c++入口,而是表示变量的入口。
现在,我可以调用其他cpp函数,这些函数以指针作为输入,返回的pointer作为参数,它工作得很好。
c++函数将指针指针作为参数,然后将输入指针所引用的入口的值更改为程序后面将使用的对象。
void myFunc(void **ptr, double value)
{
*ptr = &value;
}; 发布于 2022-07-07 16:52:41
一种只适用于ctype的解决方案:
test.cpp
#include <stdio.h>
#ifdef _WIN32
# define API __declspec(dllexport)
#else
# define API
#endif
extern "C"
API void myFunc(double* ptr, double value) {
*ptr = value;
};test.py
import ctypes as ct
dll = ct.CDLL('./test')
dll.myFunc.argtypes = ct.POINTER(ct.c_double), ct.c_double
dll.myFunc.restype = None
val = ct.c_double()
dll.myFunc(val, 14)
print(val.value)输出:
14.0发布于 2022-07-06 15:09:56
pybind11中的指针函数参数不是这样工作的。
所有“指针到T”和“引用到T”函数参数都被转换成Python只能看到普通T,所以如果调用
x = 0.123
myFunc(x, 42)Python看到一个接受两个float参数的函数,而C++实现在*ptr = val赋值之前看到*ptr == 0.123。
void myFunc(double* ptr, double value)
{
std::cout << "Before:\t\t" << *ptr << std::endl;
*ptr = value;
std::cout << "After:\t\t" << *ptr << std::endl;
};
Before: 0.123
After: 42C++函数中的指针不是指向Python x对象(一般情况下不可能,因为Python的float不一定与C++的double相同),而是指向调用期间pybind11机器持有的C++表示。对C++对象的修改不会传播回Python。
为了在C++和pybind11之间传递指针,您需要将它们封装在某种类型中,将它们隐藏在pybind11机器中。
https://stackoverflow.com/questions/72885134
复制相似问题