我正在使用树莓派与连接到GPIO的自定义硬件进行交互。控制软件是用Python编写的,而自定义硬件的接口则是用C编写的,因为它是一个更快的C实现。现在我需要从Python中调用我的C函数,并最近学习了如何用Cython包装C。我已经使一切正常工作,除了将Python列表传递给C函数。
我的自定义硬件需要发送1到32个字节,因此使用了数组。
我阅读过的Cython教程和其他参考资料要么非常简单,不包括如何将列表传递给C,要么使用我没有使用的numpy,要么使用非常复杂的代码示例,缺乏足够的文档使我无法正确理解它。
现在我所拥有的是:
test.c
使用在 cython.org 上的教程,我的 getAll() 和 pop() 函数能够正常工作,但当我包含 putAll() 函数(从链接中找到的 process_byte_data 示例代码中获取,关于 Unicode 和传递字符串 > 从 Python 代码接受字符串),我遇到了以下错误:
现在,我有一个解决方法 - 将最多32个字节组合成int并作为long int传递,然后在C中拆分它 - 但它非常丑陋。
另外,我不需要Cython来获得任何性能提升,除了使用C实现的库与Python实现的库相比,用于与我的自定义硬件进行接口。
我的自定义硬件需要发送1到32个字节,因此使用了数组。
我阅读过的Cython教程和其他参考资料要么非常简单,不包括如何将列表传递给C,要么使用我没有使用的numpy,要么使用非常复杂的代码示例,缺乏足够的文档使我无法正确理解它。
现在我所拥有的是:
test.c
#include <stdio.h>
#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中拆分它 - 但它非常丑陋。
另外,我不需要Cython来获得任何性能提升,除了使用C实现的库与Python实现的库相比,用于与我的自定义硬件进行接口。