SWIG C-zu-Python Int-Array

9

Ich versuche auf eine C-Funktion mit dem folgenden Prototyp von python mit swig zuzugreifen:

%Vor%

Swig erstellt das .so ohne Probleme und ich kann es in Python importieren, aber wenn ich versuche, darauf mit folgendem zuzugreifen:

%Vor%

Ich bekomme den folgenden Traceback:

%Vor%

Der Zeiger soll ein int-Array mit der Größe sein, die von memoryCells

definiert wird     
Adam 25.04.2011, 12:53
quelle

3 Antworten

9

Verwenden Sie Ctypes, wenn Sie können. Es ist einfacher. Da Sie jedoch nach SWIG gefragt haben, benötigen Sie eine Typmap, die beschreibt, wie mit dem int * umzugehen ist. SWIG weiß nicht, auf wie viele ganze Zahlen verwiesen werden kann. Unten wird von einem Beispiel in der SWIG-Dokumentation zu Multi-Argument-Typmaps gehackt:

%Vor%

Beachten Sie, dass Sie bei dieser Definition, wenn Sie von Python aufgerufen werden, den Parameter memoryCells weglassen und nur ein Array wie [1,2,3,4] für cellFailure übergeben. Die Typemap generiert den Parameter memoryCells .

P.S. Ich kann ein voll funktionsfähiges Beispiel (für Windows) veröffentlichen, wenn Sie es wollen.

    
Mark Tolonen 26.04.2011, 02:42
quelle
7

Mark hat Recht, Sie brauchen eine Typenkarte. Es ist jedoch nicht erforderlich, die Typemap manuell zu codieren, wenn Sie numpy.i (http://docs.scipy.org/doc/numpy/reference/swig.interface-file.html) verwenden, die bereits die erforderlichen Typmaps definiert mach C zu NumPy-Arrays und umgekehrt.

In Ihrem Fall (vorausgesetzt, cellFailure ist ein Eingabe-Array) wollen Sie

verwenden %Vor%

Beachten Sie (wie bereits erwähnt wurde), dass dies die beiden Parameter in C bequem zu einem einzigen Python-Array-Parameter fusioniert, so dass die Array-Länge nicht separat übergeben werden muss. Ihr Anruf wird wie folgt aussehen:

%Vor%     
kynan 30.05.2011 19:20
quelle
2

Sie müssen ein Array von c_int erstellen, damit das funktioniert:

%Vor%

Aktualisiert Hinzufügen eines vollständigeren Beispiels. Ich benutze Ctypes Version 1.1.0 unter Python 2.6; vielleicht machen wir etwas etwas anderes?

Vielleicht übergeben Sie stattdessen ctypes.byref(arr) ?

%Vor%

Folgendes habe ich getestet:

Gemeinsames Objekt: cosetCoding.c

%Vor%

Kompilieren:

%Vor%

Python-Skript: test_coset.py

%Vor%

Ausgabe:

%Vor%     
samplebias 25.04.2011 13:50
quelle

Tags und Links