gpt4 book ai didi

c - 扩展模块: marshalling void * to bytearray (and/or vice versa)

转载 作者:行者123 更新时间:2023-11-30 16:53:14 25 4
gpt4 key购买 nike

使用python做一些实验(意味着 python3 )用于准备数据(也将它们发送到有线 - SPI)显示它很慢(系统有限)。所以我正在考虑创建用 C 编写的扩展模块将关键的事情推迟到。我想要:

  • python脚本将有权访问 malloc() 创建的内存块在扩展模块中希望可以透明地转换为 bytearray
  • 扩展模块将获取指向 bytearray 的指针在 python 创建的对象希望可以透明地转换为 void *

目标是零复制也可作为 python 均可访问的零转换内存块。 (如 bytearray )和扩展模块(如 void * )。

有什么方法,如何实现这一点吗?

最佳答案

好吧,看起来比想象的要简单;-)

  • bytearray 提供对访问底层内存块的直接支持,这正是我们所需要的
  • 有一个格式说明符,用于从函数调用参数列表中提取 bytearray 对象

C 扩展模块 [test.c]:

#include <Python.h>
#include <stdint.h>

/* Forward prototype declaration */
static PyObject *transform(PyObject *self, PyObject *args);

/* Methods exported by this extension module */
static PyMethodDef test_methods[] =
{
{"transform", transform, METH_VARARGS, "testing buffer transformation"},
{NULL, NULL, 0, NULL}
};


/* Extension module definition */
static struct PyModuleDef test_module =
{
PyModuleDef_HEAD_INIT,
"BytearrayTest",
NULL,
-1,
test_methods,
};


/*
* The test function
*/
static PyObject *transform(PyObject *self, PyObject *args)
{
PyByteArrayObject *byte_array;
uint8_t *buff;
int buff_len = 0;
int i;


/* Get the bytearray object */
if (!PyArg_ParseTuple(args, "Y", &byte_array))
return NULL;

buff = (uint8_t *)(byte_array->ob_bytes); /* data */
buff_len = byte_array->ob_alloc; /* length */

/* Perform desired transformation */
for (i = 0; i < buff_len; ++i)
buff[i] += 65;

/* Return void */
Py_INCREF(Py_None);
return Py_None;
}


/* Mandatory extension module init function */
PyMODINIT_FUNC PyInit_BytearrayTest(void)
{
return PyModule_Create(&test_module);
}

C 扩展模块构建/部署脚本 [setup.py]:

#!/usr/bin/python3
from distutils.core import setup, Extension

module = Extension('BytearrayTest', sources = ['test.c'])

setup (name = 'BytearrayTest',
version = '1.0',
description = 'This is a bytearray test package',
ext_modules = [module])

构建/安装扩展模块:

# ./setup.py build
# ./setup.py install

测试一下:

>>> import BytearrayTest
>>> a = bytearray(16); a
bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
>>> BytearrayTest.transform(a); a
bytearray(b'AAAAAAAAAAAAAAAA')
>>>

关于c - 扩展模块: marshalling void * to bytearray (and/or vice versa),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40959180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com