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