相关疑难解决方法(0)

SWIG将C库连接到Python(从C'序列'结构创建'可迭代'Python数据类型)

我为C库编写了一个Python扩展.我有一个如下所示的数据结构:

typedef struct _mystruct{
   double * clientdata;
   size_t   len;
} MyStruct;
Run Code Online (Sandbox Code Playgroud)

此数据类型的目的直接映射到Python中的列表数据类型.因此,我想为导出的结构创建"类似列表"的行为,因此使用我的C扩展编写的代码更像是"Pythonic".

特别是,这是我想要做的(来自python代码)注意:py_ctsruct是在python中访问的ctsruct数据类型.

我的要求可以归结为:

  1. list(py_ctsruct)返回一个python列表,其中包含从c结构中复制的所有内容
  2. py_cstruct [i]返回ith元素(最好在无效索引上抛出IndexError)
  3. 对于py_ctsruct中的elem:枚举的能力

根据PEP234,如果一个对象实现_ iter _()或_ getitem _(),则可以使用"for"进行迭代.然后使用该逻辑,我认为通过将以下属性(通过重命名)添加到我的SWIG接口文件,我将获得所需的行为(除了上面的请求#1 - 我仍然不知道如何实现):

__len__
__getitem__
__setitem__
Run Code Online (Sandbox Code Playgroud)

我现在能够在python中索引C对象.我还没有实现Python异常抛出,但是如果超出数组边界,则返回一个幻数(错误代码).

有趣的是,当我尝试使用'for x in'语法迭代结构时,例如:

for i in py_cstruct:
    print i
Run Code Online (Sandbox Code Playgroud)

Python进入一个无限循环,只是在控制台上打印上面提到的魔术(错误)数字.这告诉我索引有问题.

最后但并非最不重要,我如何实施要求1?这涉及(据我所知):

  • 从python 处理'函数调用列表()
  • 从C代码返回Python(列表)数据类型

[[更新]]

我有兴趣看一下我需要在我的接口文件中放入什么(如果有的话)声明的一些代码片段,以便我可以从Python迭代c结构的元素.

c python swig

7
推荐指数
1
解决办法
3972
查看次数

标签 统计

c ×1

python ×1

swig ×1