5

Python から既存の C コードを呼び出そうとしています。C コードは、 s のB構造体配列を含む構造体を定義しますA。C コードは、呼び出されたときに値を構造体に入れる関数も定義します。配列メンバー変数にアクセスできますが、リスト (またはインデックス作成をサポートするもの) ではありません。代わりに、のプロキシであるオブジェクトを取得していますB*

この質問を見つけましたが、完全に解決されたようには見えません。Bを置き換えるためにPython クラスのインスタンスを作成する方法もわかりませんPyString_FromString()

以下は、私の問題とその実行方法を示すために必要なコードです。

たとえば .h

typedef struct A_s
{
  unsigned int thing;
  unsigned int other;
} A_t;

typedef struct B_s
{
  unsigned int size;
  A_t items[16];
} B_t;

unsigned int foo(B_t* b);

example.c

#include "example.h"

unsigned int
foo(B_t* b)
{
  b->size = 1;
  b->items[0].thing = 1;
  b->items[0].other = 2;
}

たとえば .i

%module example
%{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}

%include "example.h"

setup.py

from distutils.core import setup, Extension

module1 = Extension('example', sources=['example.c', 'example.i'])
setup(name='Example', version='0.1', ext_modules=[module1])

script.py - これはライブラリを使用し、失敗を示します。

import example
b = example.B_t()
example.foo(b)
print b.size
print b.items
for i in xrange(b.size):
    print b.items[i]

すべてを実行する方法:

python setup.py build_ext --inplace
mv example.so _example.so
python script.py
4

1 に答える 1

0

次のような C ヘルパー関数を書くことができます。

int get_thing(B_t *this_b_t, int idx);
int get_other(B_t *this_b_t, int idx);
void set_thing(B_t *this_b_t, int idx, int val);
void set_other(B_t *this_b_t, int idx, int val);

これらをラップすると、取得したポインターを使用してexample.B_t()、データ構造配置内の値にアクセスできます。

>>> b = example.B_t()
>>> a_thing = example.get_thing(b, 0)
>>> example.set_thing(b,0,999)

うまくいけば、これらのC関数の実装がどうあるべきかが明らかです-そうでない場合は、例を提供できます...

確かに、これはPythonリストのようにC配列にアクセスできるほどシームレスではありません-これを達成するためにタイプマップを使用できるかもしれませんが、このインスタンスで必要になる正確な構文を思い出せません-あなたがしなければならないでしょうSWIGドキュメントのRTFMのビット

ここでも重複する可能性があります:SWIGを使用したPythonでのネストされた構造配列へのアクセス

于 2012-10-12T10:53:09.170 に答える