首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pybind11指针引用

Pybind11指针引用
EN

Stack Overflow用户
提问于 2022-07-06 14:15:08
回答 3查看 288关注 0票数 0

我试图在python中使用一个以指针作为参数的c++函数。对于facade,我在python中使用pybind11和ctype来创建指针。

但是,我在python中得到的附加项并不等于c++中的一个。在项目的后面,我确实需要变量的入口,并且我不能通过返回来获得它,因为函数已经返回了其他的东西。

c++函数

代码语言:javascript
复制
  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码

代码语言:javascript
复制
m.def("myFunc",
    [](double* ptr,
        double value) {
            myFunc(ptr, value);
    }, "funtion to test stuff out");

python代码

代码语言:javascript
复制
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)

输出

代码语言:javascript
复制
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中获得相同的入口?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-07-07 11:35:42

我解决了这个问题。这只是我思考过程中的一个错误。Pybind现在看起来像这样

代码语言:javascript
复制
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++函数将指针指针作为参数,然后将输入指针所引用的入口的值更改为程序后面将使用的对象。

代码语言:javascript
复制
  void myFunc(void **ptr, double value)
  {
      *ptr = &value;
  }; 
票数 0
EN

Stack Overflow用户

发布于 2022-07-07 16:52:41

一种只适用于ctype的解决方案:

test.cpp

代码语言:javascript
复制
#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

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
14.0
票数 1
EN

Stack Overflow用户

发布于 2022-07-06 15:09:56

pybind11中的指针函数参数不是这样工作的。

所有“指针到T”和“引用到T”函数参数都被转换成Python只能看到普通T,所以如果调用

代码语言:javascript
复制
x = 0.123
myFunc(x, 42)

Python看到一个接受两个float参数的函数,而C++实现在*ptr = val赋值之前看到*ptr == 0.123

代码语言:javascript
复制
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:    42

C++函数中的指针不是指向Python x对象(一般情况下不可能,因为Python的float不一定与C++的double相同),而是指向调用期间pybind11机器持有的C++表示。对C++对象的修改不会传播回Python。

为了在C++和pybind11之间传递指针,您需要将它们封装在某种类型中,将它们隐藏在pybind11机器中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72885134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档