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 wirdVerwenden 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 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
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% Sie müssen ein Array von c_int
erstellen, damit das funktioniert:
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)
?
Gemeinsames Objekt: cosetCoding.c
%Vor%Kompilieren:
%Vor%Python-Skript: test_coset.py
%Vor%Ausgabe:
%Vor%