【问题标题】:Pybind 11: How to bind C++ function that has pointer arguments?Pybind 11:如何绑定具有指针参数的 C++ 函数?
【发布时间】:2021-12-04 01:07:08
【问题描述】:

假设我得到了一个看起来像这样的函数

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 整数与 C++ 的 ints 非常不同,所以这真的不应该工作。

标签: python c++ pybind11


【解决方案1】:

在你的 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 中的增量。

【讨论】:

  • 有效!但它是pybindtest.myFunc(a); 而不是pybindtest(a);
  • 糟糕,谢谢。已编辑。
猜你喜欢
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 2013-12-23
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 2012-06-17
相关资源
最近更新 更多