Verschachtelter Struktur-Array-Zugriff in Python mit SWIG

Ich habe nicht herausgefunden, wie man auf die Array-Elemente SubStatus in der folgenden verschachtelten Struktur zugreifen kann. Ich scheine in der Lage zu sein, das erste Element zu sehen, aber verstehe nicht, wie man die Indexierung erzwingt, zB als Liste.

Jede Hilfe wird sehr geschätzt.

  • Wie würde ich über eine Liste von Dateien iterieren und sie als Subplots auf einer einzigen Figur zeichnen?
  • Boto3 kann nicht installiert werden
  • Python / Scipy 2D Interpolation (ungleichförmige Daten)
  • Python Language Question: Attribute von object () vs Funktion
  • Python joblib.Parallel vs Parallel-Python: parallel über mehrere Kerne einer einzelnen CPU?
  • Python: So entfernen Sie Elemente mit einem bestimmten Schlüssel, wenn kein Wert in OrderedDict vorhanden ist
  • Status.h:

    // Data Types typedef char CHAR; // 8 bits signed typedef short SHORT; // 16 bits signed typedef long LONG; // 32 bits signed typedef unsigned char UCHAR; // 8 bits unsigned typedef unsigned short USHORT; // 16 bits usigned #define FUNC_TYPE // built in C, leave reference as C #define DLL_API extern FUNC_TYPE __declspec(dllimport) // Sub Status Data typedef struct { LONG xyz; LONG abc; } SUB_STATUS; // Status Info typedef struct { UCHAR qrs; UCHAR tuv; SUB_STATUS SubStatus[4]; LONG wxy; } STATUS; DLL_API SHORT GetStatus( STATUS *Status ); 

    Status.i

     %module status %{ /* Includes the header in the wrapper code */ #include "status.h" %} /* Parse the header file to generate wrappers */ %include "windows.i" %include "typemaps.i" %include "status.h" 

    One Solution collect form web for “Verschachtelter Struktur-Array-Zugriff in Python mit SWIG”

    Du kannst diesen Header einpacken, ohne ihn ändern zu müssen.

     %module status %immutable; %inline %{ template <typename Type, size_t N> struct wrapped_array { Type (&data)[N]; wrapped_array(Type (&data)[N]) : data(data) { } }; %} %mutable; %{ #include "status.h" %} %include "typemaps.i" %include "std_except.i" // Only expose a reduced STATUS, without the Array: typedef struct { UCHAR qrs; UCHAR tuv; LONG wxy; } STATUS; %extend wrapped_array { inline size_t __len__() const { return N; } inline const Type& __getitem__(size_t i) const throw(std::out_of_range) { if (i >= N || i < 0) throw std::out_of_range("out of bounds access"); return $self->data[i]; } inline void __setitem__(size_t i, const Type& v) throw(std::out_of_range) { if (i >= N || i < 0) throw std::out_of_range("out of bounds access"); $self->data[i] = v; } } %template (SubStatusArray) wrapped_array<SUB_STATUS,4>; // Hide the real array in our helper %extend STATUS { wrapped_array<SUB_STATUS,4> getSubStatus() { return wrapped_array<SUB_STATUS,4>($self->SubStatus); } } %ignore STATUS; // We've specified an alternative way of wrapping this %include "status.h" 

    Dies ist im Grunde das gleiche wie meine Antwort hier , aber anstatt den Header zu modifizieren, um das wrapped_array , haben wir %ignore , um SWIG zu sagen, dass wir unsere eigene Definition von STATUS dafür liefern werden. (Das ist völlig legal, die SWIG generierte Wrapper wird immer noch die echte Definition von status.h)

    Wir injizieren in diese veränderte Definition einen getSubStatus() , der ein Objekt zurückgibt, das als Proxy in das reale Array in STATUS . Dieser Proxy liefert wiederum __getitem__ , __setitem__ und __len__ dass python sucht, um den Index-Operator zu verwenden.

    Es könnte ein Weg sein, dies richtig in Python zu tun, ohne dass der getSubStatus() , was SWIG-Set __swig_setmethods__["SubStatus"] und __swig_getmethods__["SubStatus"] passend, aber ich bin mir nicht sicher von der Spitze meines Kopfes Mach SWIG-Python dazu.

    Wenn du C benutzt, nicht mit C ++ kannst du die Vorlage zu Gunsten von nur einer einfachen struct und einen Zeiger anstelle eines Verweises auf ein Array verwenden.

    Python ist die beste Programmiersprache der Welt.