python往c语言传指针_如何使用Cython将Python列表传递给C函数

博主在Raspberry Pi上通过Python与C语言接口的自定义硬件交互,遇到的问题是如何在Cython中将Python列表传递给C函数。他们成功地实现了从Python到C的字节数组传递,但遇到了将C数组回传到Python的困难。解决方案是通过创建C指针并在Python中分配内存,然后将列表元素逐个放入C数组,最后传递指针给C函数。这种方法虽然有效,但效率不高。
摘要由CSDN通过智能技术生成

我正在使用Raspberry Pi与连接到GPIO的自定义硬件进行交互.控制软件是用

Python编写的,自定义硬件的接口是用C语言编写的,因为它是一个更快的C实现.我现在需要从我的Python开始调用我的C函数,并且最近一直在学习如何在Cython中包装C.除了将Python列表传递给C函数之外,我已经完成了所有工作.

我的自定义硬件需要从1到32个字节发送,因此使用数组.

我在线阅读的Cython教程和其他参考文献都非常简单,不包括如何将列表传递给C,使用numpy,我没有使用,或使用非常复杂的代码示例,缺乏足够的文档供我理解正常.

我现在拥有的是:

test.c的

#include

#include "test.h"

void pop(void) {

a[0] = 0x55;

a[1] = 0x66;

a[2] = 0x77;

a[3] = '\0';

}

void putAll(int n, char c[]) {

memcpy(a, c, n);

}

char *getAll(void) {

return &a[0];

}

test.h

char a[4];

void putAll(int n, char[]);

char *getAll(void);

pytest.pyx

cimport defns

# Populate C array with values

def pypop():

defns.pop()

# Pass python list to C

def pyPutAll(int n, char[:] pyc):

cdef char* c = pyc

defns.putAll(n, c)

# Get array from C

def pyGetAll():

cdef char* c = defns.getAll()

cdef bytes pyc = c

print pyc

defns.pxd

cdef extern from "test.h":

char a[4]

void pop()

void putAll(int n, char c[])

char *getAll()

使用cython.org中的教程,我的getAll()和pop()函数可以工作,但是当我包含putAll()函数时(取自在链接中找到的process_byte_data示例代码,在Unicode下传递字符串>从Python代码接受字符串) ),我收到此错误:

python setup.py build_ext -i

Error compiling Cython file:

------------------------------------------------------------

...

def pyputAll(int n, char[:] pyc):

^

------------------------------------------------------------

pytest.pyx:13:25: Expected an identifier or literal

现在,我有办法解决这个问题 – 将最多32个字节组合成一个int并传递为一个long int,然后在C中将它拉开 – 但它非常难看.

此外,除了使用C实现的库与我的自定义硬件与Python实现的硬件接口之外,我不需要Cython来获得任何性能提升.

任何帮助将不胜感激.

(编辑)解决方案

我设法让这个工作.以下是我现在为需要它的人提供的代码.

pytest.pyx

...

def pyPutAll(int n, c):

cdef int *ptr

ptr = malloc(n*cython.sizeof(int))

if ptr is NULL:

raise MemoryError()

for i in xrange(n):

ptr[i] = c[i]

defns.putAll(n, ptr)

free(ptr)

...

test.c的

void putAll(int n, int c[])

{

char d[n];

int i;

for (i=0;i

d[i] = c[i];

}

memcpy(addr, d, n);

}

这段代码不是最优的,因为它在python / cython代码中使用了int,然后在C函数中将它转换为char. pytest.pyc中的pyPutAll()函数接受一个普通的python列表.然后它创建一个C指针并分配内存.迭代列表,将每个值放入C数组,最后将指针传递给C函数.

它完成了工作,但我确信其他人可以提供更有效的解决方案.

马特

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值