首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用不同项目的Py_buffer和PyMemoryView_FromBuffer

使用不同项目的Py_buffer和PyMemoryView_FromBuffer
EN

Stack Overflow用户
提问于 2013-03-06 02:05:43
回答 1查看 5.3K关注 0票数 5

这个问题与我之前提出的一个问题有关。即this one,如果有人感兴趣的话。基本上,我想要做的是使用封装在Py_buffer中的memoryview-object向Python公开一个C数组。我已经让它使用PyBuffer_FillInfo (work =我可以用Python操作数据并将其写入C中的stdout ),但是如果我试图滚动自己的缓冲区,则在C函数返回后得到一个分段错误。

我需要创建自己的缓冲区,因为PyBuffer_FillInfo假定格式是char,使itemsize字段为1,我需要能够提供大小为1、2、4和8的项。

一些代码,这是一个有用的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Py_buffer *buf = (Py_buffer *) malloc(sizeof(*buf));
int r = PyBuffer_FillInfo(buf, NULL, malloc(sizeof(char) * 4), 4, 0, PyBUF_CONTIG);
PyObject *mv = PyMemoryView_FromBuffer(buf);
//Pack the memoryview object into an argument list and call the Python function
for (blah)
  printf("%c\n", *buf->buf++); //this prints the values i set in the Python function

看看PyBuffer_FillInfo的实现,它非常简单,我滚动了自己的函数,以便能够提供自定义项目大小:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//buffer creation function
Py_buffer *getReadWriteBuffer(int nitems, int itemsize, char *fmt) {
  Py_buffer *buf = (Py_buffer *) malloc(sizeof(*buf));
  buf->obj = NULL
  buf->buf = malloc(nitems * itemsize);
  buf->len = nitems * itemsize;
  buf->readonly = 0;
  buf->itemsize = itemsize;
  buf->format = fmt;
  buf->ndim = 1;
  buf->shape = NULL;
  buf->strides = NULL;
  buf->suboffsets = NULL;
  buf->internal = NULL;
  return buf;
}

我如何使用它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Py_buffer *buf = getReadWriteBuffer(32, 2, "h");
PyObject *mv = PyMemoryView_FromBuffer(buf);
// pack the memoryview into an argument list and call the Python function as before

for (blah)
  printf("%d\n", *buf->buf); //this prints all zeroes even though i modify the array in Python

return 0;
//the segfault happens somewhere after here

使用我自己的缓冲区对象的结果是C函数返回后的分段错误。我真的不明白为什么会发生这种事。任何帮助都将不胜感激。

根据this question编辑,我以前没有找到,项目大小>1甚至可能根本不受支持。这使得这个问题更加有趣。也许我可以使用PyBuffer_FillInfo,有足够大的内存块来容纳我想要的东西(例如32C浮点数)。在这种情况下,更多的问题是如何将Python分配给Python函数中的memoryview对象。提问问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-08 02:53:15

因此,在缺乏答案的情况下,我决定采取另一种方法,而不是我最初想要的方法。把这个留在这里以防别人遇到同样的麻烦。

基本上,而不是创建一个缓冲区(或字节数组,等价物)。并将其传递给Python,以供扩展用户修改。我只是稍微重新设计了代码,这样用户就可以从Python回调函数返回字节数组(或支持缓冲区接口的任何类型)。这样,我甚至不需要担心条目的大小,因为在我的示例中,C代码对返回的对象所做的一切就是提取它的缓冲区并使用简单的memcpy将其复制到另一个缓冲区。

代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PYGILSTATE_ACQUIRE; //a macro i made
PyObject *result = PyEval_CallObject(python_callback, NULL);
if (!PyObject_CheckBuffer(result))
  ; //raise exception

Py_buffer *view = (Py_buffer *) malloc(sizeof(*view));
int error = PyObject_GetBuffer(result, view, PyBUF_SIMPLE);
if (error)
  ; //raise exception

memcpy(my_other_buffer, view->buf, view->len);

PyBuffer_Release(view);
Py_DECREF(result);
PYGILSTATE_RELEASE; //another macro

我希望这能帮上忙。

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

https://stackoverflow.com/questions/15244255

复制
相关文章
14.不同条目的listview
分类界面 整个项目的逻辑就是这样的 CategoryInfo public class CategoryInfo { private String title; private String u
六月的雨
2018/05/14
6210
Vue3项目的创建和托管
前面我们在学习Vue的时候都是将Vue的代码直接写在html文件的script中,但实际工作中,我们会使用工具(比如vue-cli)创建完整的项目结构,同时将vue项目托管于nodeJS等JS运行时,实现前端服务的生产化部署。
Python研究所
2022/06/17
7440
Vue3项目的创建和托管
Socket Sendto 可以传入不同的目的地址吗
通常我们认为 socket 中 地址信息 和 socket句柄 是一一对应的,不能往一个socket句柄中,传入不同的地址信息。
twowinter
2020/04/17
1.8K0
react-admin+material ui5.0项目的总结
为了更好的进行前后端的设计开发 后端目前用postgrest设计数据库 前端直接使用react-admin和material ui 5.0进行开发 大大增加开发效率
爱学习的前端歌谣
2023/10/18
3570
react-admin+material ui5.0项目的总结
【Z投稿】Zabbix自动发现为不同的监控项设置不同的阈值
Zabbix认证工程师(ZCS),多年Linux运维经验,精通Zabbix开源监控系统的架构、部署、使用和维护,有较强的Shell和Python开发能力。
Zabbix
2021/02/03
1.2K0
详解基于Vue2.0项目的webpack配置文件
Vue提供了一个很好的命令行工具:vue-cli,用来快速构建Vue项目。 现在,我们改造一个由vue-cli创建的simple project,使其提供更强大的功能。
娜姐
2022/05/13
2.1K0
详解基于Vue2.0项目的webpack配置文件
不同环境相同配置项的内容如何diff差异?
在工作中,我们用到的环境经常会有很多套,由于不同的环境使用的配置是不一样的,那么怎么能够对比所有不同环境的相同配置项各是什么内容呢?
Wu_Candy
2022/07/04
1.2K0
不同环境相同配置项的内容如何diff差异?
TSX 在Vue项目的使用
答: 我的理解SFC更侧重Html语法,就像画一幅画,使用标签画好结构,再将数据使用js进行填充,这样js的灵活性就难以发挥。JSX侧重于JS语法,没有条条框框的架子,可以在白色画布灵活自由的画画。
星宇大前端
2020/12/16
2.3K0
TSX 在Vue项目的使用
使用Zuthaka管理不同APT和其他后渗透工具
Zuthaka是一款开源的应用程序,旨在帮助红队研究人员完成安全分析与管理任务。Zuthaka可以简化很多操作任务,比如说针对不同APT和其他后渗透工具的管理等等。 除此之外,Zuthaka还是一个免费的开源协作C&C整合框架,可以允许广大开发人员专注于其命令控制服务器的核心功能和目标。 当前的C2生态系统正在迅速发展,以适应现代红队作战和多样化需求。这也给安全专业人员带来了很大的额外工作量以及开销。创建C2系统已经是一项艰巨的任务了,而且大多数可用的C2系统系统都缺乏直观且易于使用的Web界面。 因此,Z
FB客服
2023/03/30
2500
使用Zuthaka管理不同APT和其他后渗透工具
Kotlin | 1.定义和目的
本章内容包括: Kotlin 的基本示范 Kotlin 语言的主要特征 Android 和服务端开发的可能性 Kotlin 与其他语言的区别 用 Kotlin 编写并运行代码 Kotlin和Java一样是一种静态类型的编程语言。编译时即可检查代码正确性。动态语言:Groovy,JRuby。 根据上下问判断变量类型: val x=1 性能、可靠性、可维护性、工具支持。 --- 支持函数式编程风格,不强制使用: 函数类型,允许函数接受其他函数作为参数,或者返回其他函数。 lambda表达式 数据类,提供了创建不
Jingbin
2019/03/28
4560
六西格玛项目与QC项目的不同之处在哪?
很多六西格玛的初学者一开始总会有个困扰,六西格玛项目和QC项目到底有什么不同,什么样的项目适合用六西格玛方法论来做,什么样的又适合QC?本文,天行健简析如下:
用户9972271
2023/03/08
8300
in 和 exists 的不同
in 是把外表和内表做 hash 连接,而 exists 是对外表作 loop 循环,每次 loop 循环再对内表进行查询,一直以来认为 exists 比 in 的效率高的说法是不准确的。如果两个表大小相当,则 in 和 exists 的效率是差不多的,如果两个表的一大一小,则子查询表大的用 exists,子查询表小的用 in。
zucchiniy
2019/10/30
8110
EMLOG通过不同域名使用不同的模板
只在emlog根目录的index.php简单修改就能实现,也可以做多用户二级域名调用不同的模板。当然也可以修改模板不同域名显示不同用户的文章。 $templet=Option::get('nonce_templet'); $the_host = $_SERVER['HTTP_HOST']; if ($the_host=='i.isiyuan.net') {////判断域名或者浏览器UA使用不同的前台模板 $templet='pink';//前台模板名 } define('TEMPLAT
Youngxj
2018/06/06
2.1K0
使用Bitbucket Pipeline进行.Net Core项目的自动构建、测试和部署
1. 引言 首先,Bitbucket提供支持Mercurial和Git版本控制系统的网络托管服务。简单来说,它类似于GitHub,不同之处在于它支持个人免费创建私有项目仓库。除此之外,Bitbucket提供的Pipeline功能可以帮助我们进行项目的自动构建、测试和部署。 2. 使用指南 该项目是使用Abp创建的.Net Core版本的模板项目,项目结构如下: 点击Pipeline,我们选择.NET Core,即可创建用于配置Pipeline的配置文件bitbucket-pipelines.ym
圣杰
2018/01/11
2.1K0
使用Bitbucket Pipeline进行.Net Core项目的自动构建、测试和部署
使用 Gcov 和 LCOV 度量 C/C++ 项目的代码覆盖率
本篇分享如何使用 Gcov 和 LCOV 对 C/C++ 项目进行代码覆盖率的度量,以及在之前 关于代码覆盖率(Code Coverage) 篇中没有提到的观点写在了本文最后的《不要高估代码覆盖率指标》部分。
Peter Shen
2021/08/26
5.7K1
使用 Gcov 和 LCOV 度量 C/C++ 项目的代码覆盖率
[CSS]第一项和最后一项样式
列表项的第一项距离顶部0.2rem,最后一项距离底部0.5rem .item:first-child { padding-top: .2rem; } .item:last-child { padding-bottom: .5rem; }
悟空聊架构
2018/06/26
4220
Flink实践-使用 Elasticsearch 作为目的端
实时即未来,最近在腾讯云 Oceanus 进行实时计算服务,分享给大家~ 本次实践通过流计算 Oceanus (Flink)把数据写入到 ES 目的端。 注意点: 使用 ES 作为 Sink 时,若源端为MySQL等数据库需要捕捉数据变化使用 MySQL-CDC时,需使用upsert方式插入数据。不能使用append方式。 记录中字段有timestamp类型时,需指定类型长度(timestamp(3)),否则会报以下错误。 语法检查失败:org.apache.flink.table.api.Validati
吴云涛
2021/10/09
5540
Flink实践-使用 Elasticsearch 作为目的端
如何使用Zuthaka管理不同APT和其他后渗透工具
 关于Zuthaka  Zuthaka是一款开源的应用程序,旨在帮助红队研究人员完成安全分析与管理任务。Zuthaka可以简化很多操作任务,比如说针对不同APT和其他后渗透工具的管理等等。 除此之外,Zuthaka还是一个免费的开源协作C&C整合框架,可以允许广大开发人员专注于其命令控制服务器的核心功能和目标。 当前的C2生态系统正在迅速发展,以适应现代红队作战和多样化需求。这也给安全专业人员带来了很大的额外工作量以及开销。创建C2系统已经是一项艰巨的任务了,而且大多数可用的C2系统系统都缺乏直观且易于使用
FB客服
2023/03/30
3020
如何使用Zuthaka管理不同APT和其他后渗透工具
面试加分项-HashMap源码中这些常量设计目的你知道吗
之前周会技术分享,一位同事讲解了HashMap的源码,涉及到一些常量设计的目的,本文将谈谈这些常量为何这样设计,希望大家有所收获。
捡田螺的小男孩
2020/04/15
5500
面试加分项-HashMap源码中这些常量设计目的你知道吗
点击加载更多

相似问题

度量来自不同项目的依赖项(JDepend?)

14

使用角6和.net核心2项目的

10

如何在项目和项目的依赖项之间指定不同的pypi源

125

对TFS 2013项目的不同分支设置不同的权限

10

Eclipse和MyEclipse使用相同项目的不同设置

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文