如何将使用python代码作为参数获得的str
值(包含3000{'0','1'}字节)传递给需要int *
(固定长度int数组)作为输入参数的python c扩展函数(使用SWIG扩展)?我的代码是这样的:
int *exposekey(int *bits) {
int a[1000];
for (int j=2000; j < 3000; j++) {
a[j - 2000] = bits[j];
}
return a;
}
我试图使用ctypes
(请参见下面的代码):
import ctypes
ldpc = ctypes.cdll.LoadLibrary('./_ldpc.so')
arr = (ctypes.c_int * 3072)(<mentioned below>)
ldpc.exposekey(arr)
3072{0,1}进入位置。Python返回语法错误:超过255个参数。这仍然不能帮助我传递指定的str值,而不是初始化的ctypes
int数组。
其他建议包括使用SWIG类型映射,但是如何将str转换成int *
?提前谢谢。
关于我的注释,这里有一些关于从函数返回数组的详细信息:[SO]: Returning an array using C。简而言之:处理这个问题的方法:
让这段C代码在Python解释器中运行有两种方法:
既然他们都在做同一件事,把他们混在一起是没有意义的。所以,选一个最适合你需要的。
一。ctypes
ctypes演示.c:
注意:
int*
更改为char*
,因为它的紧凑性是原来的4倍(尽管由于忽略每个字符的7位而只使用其中一个字符,它仍然效率低下;这是可以修复的,但需要按位处理)测试类型.py:
注意:
bits_in = create_string_buffer(bits_string.encode())
输出(使用Python3.5打开Win运行):
2。swig
swig_demo.c:
swig_demo.i:
swig_demo.h:
注意:
%include
)%newobject
指令,该指令释放exposekey返回的指针,以避免内存泄漏测试开关py:
注意:
输出:
三。普通的Python C API- 我把这部分作为个人练习加上去了
- 这就是swig所做的,但是“手动”
capi演示.c:
注意:
from swig_demo import exposekey
应替换为from capi_demo import exposekey
相关问题 更多 >
编程相关推荐