如何使用 Boost::Python 公开原始字节缓冲区?

2024-03-17

我有第三方 C++ 库,其中一些类方法使用原始字节缓冲区。我不太确定如何在 Boost::Python 中处理它。

C++ 库头类似于:

class CSomeClass
{
  public:
      int load( unsigned char *& pInBufferData, int & iInBufferSize );
      int save( unsigned char *& pOutBufferData, int & iOutBufferSize );
}

坚持使用 Boost::Python 代码......

class_<CSomeClass>("CSomeClass", init<>())
    .def("load", &CSomeClass::load, (args(/* what do I put here??? */)))
    .def("save", &CSomeClass::save, (args(/* what do I put here??? */)))

如何包装这些原始缓冲区以将它们公开为 Python 中的原始字符串?


您必须自己在绑定上编写函数,该函数将返回py_buffer http://docs.python.org/2/c-api/buffer.html?highlight=buffer#buffers-and-memoryview-objects来自该数据的对象,允许您只读(使用PyBuffer_FromMemory)或读写(使用PyBuffer_FromReadWriteMemory) 从 Python 预先分配的 C/C++ 内存。

这就是它的样子(欢迎反馈):

#include <boost/python.hpp>

using namespace boost::python;

//I'm assuming your buffer data is allocated from CSomeClass::load()
//it should return the allocated size in the second argument
static object csomeclass_load(CSomeClass& self) {
  unsigned char* buffer;
  int size;
  self.load(buffer, size);

  //now you wrap that as buffer
  PyObject* py_buf = PyBuffer_FromReadWriteMemory(buffer, size);
  object retval = object(handle<>(py_buf));
  return retval;
}

static int csomeclass_save(CSomeClass& self, object buffer) {
  PyObject* py_buffer = buffer.ptr();
  if (!PyBuffer_Check(py_buffer)) {
    //raise TypeError using standard boost::python mechanisms
  }

  //you can also write checks here for length, verify the 
  //buffer is memory-contiguous, etc.
  unsigned char* cxx_buf = (unsigned char*)py_buffer.buf;
  int size = (int)py_buffer.len;
  return self.save(cxx_buf, size);
}

稍后,当您绑定时CSomeClass,使用上面的静态函数而不是方法load and save:

//I think that you should use boost::python::arg instead of boost::python::args
// -- it gives you better control on the documentation
class_<CSomeClass>("CSomeClass", init<>())
    .def("load", &csomeclass_load, (arg("self")), "doc for load - returns a buffer")
    .def("save", &csomeclass_save, (arg("self"), arg("buffer")), "doc for save - requires a buffer")
    ;

这对我来说看起来足够Pythonic了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Boost::Python 公开原始字节缓冲区? 的相关文章

随机推荐

  • 如何让wxpython密码textctrl显示字符?

    使用 wxPython 可以将密码字段创建为 wx TextCtrl frm 1 style wx TE PASSWORD 我想知道是否有一种方法可以动态地将这个密码字段更改为普通的文本控件 以便用户可以看到密码是什么 创建控件后无法更改样
  • 在 ScrollView 中使用 RecyclerView 并具有灵活的 Recycler 项目高度

    我想知道是否有任何可能的方法可以使用回收视图 在此之前 我使用 RecyclerView固定高度里面一个滚动视图但这次我不知道该物品的高度 Hint 在问这个问题之前 我阅读了堆栈问题上的所有问题和解决方案 update 一些解决方案展示了
  • 使用 Mercurial,如何记录具有跨分支祖先的分支?

    在 Mercurial 中 我想构建所有提交消息的更改日志以进行修订stable分支 目前 我正在使用 hg log r
  • 使用 v4l2loopback 和 EDSDK Liveview 进行佳能 DSLR 视频环回?

    我想使用 DSLR 相机作为视频输入 例如在 Linux 和 Android 下进行 Skype Google talk 是否可以使用 v4l2loopback 和 Canon EDSDK 创建视频环回 如何将实时取景缓冲区从摄像机传输到视
  • 为什么 DataContractSerializer 不支持属性?

    我根据客户的文档创建 xsd 并且所有 xsd 都有属性 我一直在使用 xsd exe 从 xsd 生成类 但我读到 DataContractSerializer 不支持属性 为什么不 这是否意味着我只能有一个只有元素的soap xml 文
  • 关于 TypeScript 的 noUnusedParameters 编译器选项的说明

    在 GitHub 上输入任何内容之前 我试图确定这实际上是否是一个错误 With noUnusedParameters启用后 TypeScript 编译器会出现如下错误 const foo one two three foo forEach
  • 生日显示为去年的年龄?

    我正在测试一个我想在其中使用它的网站的 JavaScript 片段 基本上 当页面加载我的年龄时执行的函数 我是在规定的出生日期之外做这件事的 我在使用birthDate变量时注意到一个错误 不确定为什么会发生 当birthDate月份比当
  • Doctrine ORM 内存问题

    问题 运行使用下面 Factory 类中的 Doctrine 的守护程序服务时 会出现内存问题 当守护进程服务启动时 它运行大约 175MB 一天后大约是 250MB 再过一天就达到 400MB 我正在寻找导致内存增加的原因以及如何降低内存
  • 将java库包含到自己的库中

    我为自己创建了一个小框架 我想在多个项目中使用它 我还希望分布式 jar 文件包含所有外部库 以便我的项目只需要包含我的库即可访问所有外部库 我需要这个来简化外部库的更新 所以我把它放在我的 build xml 中 它将 dist lib
  • 如何使用加特林检查 If 方法?

    记录在案here https gatling io docs current cheat sheet 加特林checkIf方法用于条件检查 它不可用于ScenarioBuilder的流畅 API 但我可以在CheckSupport班级 我在
  • 如何将在线 CSV 数据插入 SQL Server 数据库?

    我需要每天从在线可用的 csv 执行数据加载 例如http www supplier com products csv http www supplier com products csv一旦我将 csv 转储到 sql 表中 我就可以进行
  • 如何枚举es6类方法[重复]

    这个问题在这里已经有答案了 如何枚举 ES6 类的方法 如同Object keys 这是一个例子 class Callbacks method1 method2 const callbacks new Callbacks callbacks
  • 为什么 &&、&、|| 的输出不同?

    这是代码段 你能解释一下为什么输出不同 1 public static ShortCkt public static void main String args int i 0 boolean t true boolean f false
  • 使用 Makefile 在编译中排除源文件

    是否可以使用 Makefile 中的通配符函数在编译过程中排除源文件 就像有几个源文件一样 src foo cpp src bar cpp src 然后在我的 makefile 中 SRC FILES wildcard src cpp 但我
  • 以编程方式滚动离子段

    有什么办法可以控制分段的滚动吗 在我的情况下 滑块和段相互依赖 当您滑动幻灯片时 溢出段不会滑动 但将正确选择活动段 我的视图和控制器代码
  • 如何撤销 JWT 令牌?

    我正在使用 Spring Security OAuth2 和 JWT 令牌 我的问题是 如何撤销 JWT 令牌 正如这里提到的http projects spring io spring security oauth docs oauth2
  • 如何在 Node.js 中创建函数

    我正在使用 Firebase 函数创建 API 同时我使用 Firebase Firestore 作为我的数据库 我正在使用 Node js 来创建该程序 我想知道如何在 Node js 中创建函数 我将多次调用代码 因为我已经习惯了 Ja
  • 如何更改测试资源管理器的持续时间计时器,使其对于长(>1 秒)测试更有用?

    我在 Visual Studio 2013 中编写了一系列测试用例 这些测试用例通过 Visual Studio 的内置测试资源管理器运行 这些不是单元测试 因此它们都运行至少几秒钟 由于测试内容的性质 其中一些测试的运行时间甚至可能超过
  • Mac 上有什么好的 MongoDB 数据库管理应用程序吗?类似于 Sequel Pro? [复制]

    这个问题在这里已经有答案了 寻找一个可视化 mongodb 中的集合和文档的 GUI 网络上有许多可用的工具 罗博蒙戈 https robomongo org 是最好的和最著名的 Mongo客户端 http www mongoclient
  • 如何使用 Boost::Python 公开原始字节缓冲区?

    我有第三方 C 库 其中一些类方法使用原始字节缓冲区 我不太确定如何在 Boost Python 中处理它 C 库头类似于 class CSomeClass public int load unsigned char pInBufferDa