Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
C-Headers in python parsen/benutzen
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum
View previous topic :: View next topic  
Author Message
oscarwild
l33t
l33t


Joined: 15 Jul 2003
Posts: 857
Location: Memmingen, Germany, Old Europe, Earth

PostPosted: Fri Mar 21, 2008 12:04 pm    Post subject: C-Headers in python parsen/benutzen Reply with quote

Hallo,

ich suche eine Lösung für folgendes Problem:

Gegeben ist ein C-Headerfile, in dem ein oder mehrere structs definiert sind, also in der Art
Code:
typedef struct
{
  uint16 x;
  uint16 y;
  sint8 z;
} foo_t


Gibt es irgend eine Möglichkeit, das Headerfile in Python zu importieren, so dass ich die dort definierten Strukturen/Unions nutzen kann?

Mein Ziel ist es, den Adressoffset jeder Variable (analog offsetof(foo_t, <Variable>) in C) ermitteln zu können. Ob der Header dazu importiert, geparst oder anderweitig konvertiert wird, ist vollkommen egal - Voraussetzung ist alleine, dass es automatisch vonstatten geht.

Hat irgendwer einen Lösungsansatz parat?

Gruß + frohe Ostern
OscarWild
_________________
http://blog.selbsthilfenetzwerk-cannabis-medizin.de
Back to top
View user's profile Send private message
Necoro
Veteran
Veteran


Joined: 18 Dec 2005
Posts: 1912
Location: Germany

PostPosted: Sat Mar 22, 2008 1:01 am    Post subject: Reply with quote

Schaust du dir an: Cython oder Pyrex oder SWIG :) ... für automatische Generierung ist wahrscheinlich letzteres am besten...
_________________
Inter Deum Et Diabolum Semper Musica Est.
Back to top
View user's profile Send private message
oscarwild
l33t
l33t


Joined: 15 Jul 2003
Posts: 857
Location: Memmingen, Germany, Old Europe, Earth

PostPosted: Mon Mar 24, 2008 10:07 am    Post subject: Reply with quote

Hi Necoro,

SWIG sieht vielversprechend aus, danke für den Tipp!

Gruß
OscarWild
_________________
http://blog.selbsthilfenetzwerk-cannabis-medizin.de
Back to top
View user's profile Send private message
DarKRaveR
Guru
Guru


Joined: 11 Oct 2003
Posts: 500
Location: Old Europe/G-Many

PostPosted: Fri Apr 04, 2008 5:54 am    Post subject: Reply with quote

Swif ist mehr ein Interface Generator, ala IDL etc.

Aus dem Header die Offsets parsen ist unmöglich, weil diese sich erst beim compilen in Abhängigkeit der Implementation/Platform ergeben, zumindest aber wäre es ne verdammt schlechte Idee.

Apropos, was passiert wenn man gegen eine lib linked, deren header man hat und die ein anderes Packing Pragma hat, als der zu compilende Source?

Wenn Du in Python eine C Bibliothek verwenden möchtest, dann solltest Du Dir mal die embedding und extending guide anschauen.
Back to top
View user's profile Send private message
oscarwild
l33t
l33t


Joined: 15 Jul 2003
Posts: 857
Location: Memmingen, Germany, Old Europe, Earth

PostPosted: Fri Apr 04, 2008 8:31 am    Post subject: Reply with quote

Hallo DarKRaveR,

DarKRaveR wrote:
Swif ist mehr ein Interface Generator, ala IDL etc.
Aus dem Header die Offsets parsen ist unmöglich, weil diese sich erst beim compilen in Abhängigkeit der Implementation/Platform ergeben, zumindest aber wäre es ne verdammt schlechte Idee.

Auf dieses Problem bin ich auch gestoßen, allerdings verwendet das Target kein besonderes Alignment, und es kommen keine nativen Datentypen, sondern nur welche mit definierter Bitsize zum Einsatz (wobei ein externer Generator das natürlich nicht wissen kann).
DarKRaveR wrote:

Apropos, was passiert wenn man gegen eine lib linked, deren header man hat und die ein anderes Packing Pragma hat, als der zu compilende Source?
Wenn Du in Python eine C Bibliothek verwenden möchtest, dann solltest Du Dir mal die embedding und extending guide anschauen.

Nein, so wild ist das ganze gar nicht. Die Datensätze landen auf einem embedded Target, auf das ich per I2C-Bus zugreife, und zwar über die Speicheradressen.
Bisher müssen die Offsets zu den Strukturen von Hand gepflegt werden, und es sind leider sehr viele Strukturen, was die Handarbeit ziemlich fehlerträchtig und aufwändig macht... in C fehlt leider die Möglichkeit der Reflexion.
_________________
http://blog.selbsthilfenetzwerk-cannabis-medizin.de
Back to top
View user's profile Send private message
DarKRaveR
Guru
Guru


Joined: 11 Oct 2003
Posts: 500
Location: Old Europe/G-Many

PostPosted: Fri Apr 04, 2008 8:52 am    Post subject: Reply with quote

Spräche denn dann etwas dagegen ein C modul für Python zu proggen, welches basierend auf deinen headern die Daten aquiriet und in passende Python Typen ablegt, sodaß Du dieses dann importieren kannst (in Python). Ich hatte es zumindest so verstanden, daß Du aus Python die Daten manipulieren (oder zumindest lesen) möchtest.

Die Idee: Man schreibe ein C-Modul, als Pythonerweiterung, dieses kann auch eigene Python Datentypen 'einführen' (definieren), welches auch Deine besagten Header verwendet. Im Prinzip also ein 'wrapper', das ganze schreibst Du in C, es wird ein DSO (Dynamic Shared Object), das für python die passenden Funktionen und Datentypen exportiert, selbst auf die besagten header zurückgreift und direkt Dein IO oder systemcalls etc. macht. einmal compiliert hast Du dann ein .so, welches du in site-packages wirfst und das Du dann mit 'import meinmodul' in Python verwenden kannst.

Siehe: http://docs.python.org/ext/intro.html

Und dann die vollständige Referenz: http://docs.python.org/api/api.html

Hoffe das hilft Dir weiter.

Genau auf dem Prinzip arbeiten Sachen wie PyGtk, opengl Anbindung etc. pp. (Ist im Prinzip ein Pendant zu JNI bei Java)
Back to top
View user's profile Send private message
Necoro
Veteran
Veteran


Joined: 18 Dec 2005
Posts: 1912
Location: Germany

PostPosted: Fri Apr 04, 2008 10:20 am    Post subject: Reply with quote

DarkRaveR: Ich wollte dich nur drauf hinweisen:

- wenn man Python-Erweiterungen um eine bestehende C-lib herum schreiben will, sollte man SWIG nehmen, anstatt selber auf C-Level mit der Python-API zu arbeiten (es sei denn man ist scharf darauf sich in der INCREF/DECREF-Hölle zu verlaufen). Da ich für solche Sachen persönlich auch SWIG nutze, weiß ich, dass es geht. Das IDL-ähnlich, von dem du sprichst, sind wohl die .i Dateien, die man anlegen muss, um zu sagen was man wrappen muss. - Daraus werden dann aber Python-Module erzeugt (oder auch Perl/Java/R/Scheme...)

- wenn es mit einfach wrappen nicht geht, ist es zugegebenermaßen mit SWIG manchmal aufwendig - an der Stelle empfiehlt sich Pyrex/Cython. (Auch diese benutze ich persönlich)...

Die Python-C-API braucht man zwar teilweise auch bei den beiden ansätzen - aber nur auf die API zu bauen gleicht quasi einem Kopfschuss....

/edit:
DarKRaveR wrote:
Genau auf dem Prinzip arbeiten Sachen wie PyGtk, opengl Anbindung etc. pp. (Ist im Prinzip ein Pendant zu JNI bei Java)

naja ... pygtk verwendet auch wrapperprogramme (halt glib eigene) ... also das ist auch nicht handgecodet
_________________
Inter Deum Et Diabolum Semper Musica Est.
Back to top
View user's profile Send private message
DarKRaveR
Guru
Guru


Joined: 11 Oct 2003
Posts: 500
Location: Old Europe/G-Many

PostPosted: Fri Apr 04, 2008 5:54 pm    Post subject: Reply with quote

Ah, okay, ich habe persönlich noch nicht wirklich swig benutzt (nur mal die Doku überflogen) und hatte den Eindruck, daß man eben ein Interface damit generieren kann - Wenn sich das bei Python praktisch für Module verwenden lässt, dann nur zu, man muß sich ja nicht quälen, sehe ich genauso.

Ich sag ja nur, daß eine Extension definitiv das PRoblem löst, wie er sich die zusammenbastelt sei mal freigestellt. Eventuell kannst Du ja kurz nen Abriss machen, wie das in Swig laufen würde, um damit ein Skelett des Moduls zu bekommen, das würde Ihm sicherlich helfen :wink: .

Der vollständigkeit halber für den OP:

http://www.swig.org/Doc1.3/Python.html
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum