我正在使用Raspberry Pi與連接到GPIO的自定義硬件進行接口。控制軟件是用Python編寫的,而定製硬件的接口是用C編寫的,因爲它是一個更快的C實現。我現在需要從我的Python開始調用我的C函數,並且最近一直在學習如何在Cython中打包C。除了將Python列表傳遞給C函數之外,我已經掌握了所有工作。如何使用Cython將Python列表傳遞給C函數
我的自定義硬件需要從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和傳球爲長整型,然後用C拉開它 - 但它很醜陋。另外,除了使用C實現的庫與我的自定義硬件接口與Python實現的接口之外,我不需要Cython獲得任何性能提升。
任何幫助將不勝感激。
(編輯)解決方案
我設法得到這個工作。這裏是我現在對任何需要它的人的代碼。
pytest.pyx
...
def pyPutAll(int n, c):
cdef int *ptr
ptr = <int *>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<n;i++) {
d[i] = c[i];
}
memcpy(addr, d, n);
}
此代碼是不是最佳的,因爲它使用整數在Python /用Cython代碼,然後將其轉換在C函數爲char 。 pytest.pyc中的pyPutAll()
函數接受一個普通的python列表。然後它創建一個C指針並分配內存。遍歷列表中的每個值都放入C數組中,然後最終將指針傳遞給C函數。
它完成了工作,但我相信別人可以提供更有效的解決方案。
馬特
除了修改的問題提供解決方案,它的接受*和鼓勵*回答你自己的問題,甚至將其標記爲公認的答案。 – 2016-06-14 09:18:43