Windows DLL mit Cython erzeugen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
booth
User
Beiträge: 44
Registriert: Mittwoch 31. Oktober 2007, 21:30
Wohnort: Durham, U.K.

Donnerstag 5. Februar 2009, 17:12

Hallo,

ich moechte gerne eine Windows DLL mit cython erzeugen. Wie das im Prinzip geht weiss ich auch (abgesehen davon, dass ich immer eine .pyd-Datei bekomme, aber die kann man ja umbenennen).

Als naechste Schritt moechte ich gerne die Funktionen in dieser DLL aufrufen. Dazu benutze ich LabView (soll spaeter auch so sein), dass eigentlich nur die Funktionen in den DLLs aufruft (wenigstens ist das so mit den in C++ erzeugten DLLs). Allerings werden die Funktionen aus der DLL nicht exportiert. Nur eine Funktion init+'modulname' (in meinem Fall initreTest).

Hat jemand einen Vorschlag wie man das zB mit VC++ oder sowas testen kann ob es nur an LabView liegt? Oder mache ich einen generellen Fehler.
Beim Kompilieren halte ich mich an die Beispiele auf doc.cython.org

vG,U.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Donnerstag 5. Februar 2009, 23:17

Mit cython kannst man, soweit ich weiß nur Python-Erweiterungen erstellen. Python Extensions sind zwar im Grunde dll's, aber sie geben entsprechend Python-Objekte zurück und erwarten auch Python Objekte als Argumente (welche wiederum komplexere C-structs sind). Außerhalb von Python wirst du also kaum sinnvoll auf die dll zugreifen können. Selbst wenn du es schaffst deine Funktionen zu exportieren, wird es dir nichts nützen.

MFG HerrHagen
booth
User
Beiträge: 44
Registriert: Mittwoch 31. Oktober 2007, 21:30
Wohnort: Durham, U.K.

Donnerstag 5. Februar 2009, 23:31

Klingt ja nicht sonderlich gut. Ich habe irgendwo in den Cython-Docs gelesen, dass Pyrex wohl auch fuer C++ Funktionen exportieren kann. Vielleicht klappts damit.

Anderer Tag, andere Skriptsprache.

Ansonsten muss irgendso eine Grammatik/Perl/C++-Sprache wie Antlr und pcre her. Habe nur keine Lust das auch noch zu lernen :)
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Donnerstag 5. Februar 2009, 23:38

http://shed-skin.blogspot.com/ =D

Auch wenns noch nicht sonderlich ausgereift ist =/ Aber'ne Idee wert.

...ich persönlich würd ja'ne DLL mit D erstellen, das klappt gut.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 5. Februar 2009, 23:59

Man könnte wohl auch eine DLL schreiben, die den Python-Interpreter in LabVIEW einbettet, dann kann man problemlos Python nutzen.
booth
User
Beiträge: 44
Registriert: Mittwoch 31. Oktober 2007, 21:30
Wohnort: Durham, U.K.

Freitag 6. Februar 2009, 00:09

Hmm, das klingt dann wieder ein bisschen zu involviert. Da muss man sich wohl schon ziemlich gut mit C/C++ auskennen. Ich kann die Grundzuege, aber dll's schreiben ist wohl etwas hinter meinem Horizont.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Freitag 6. Februar 2009, 00:15

Was willst du denn überhaupt mit der dll machen? Vieleicht kannst du dein Problem ja ein wenig tiefer beschreiben. Dann fällt uns u.U. noch ne andere Lösung ein.
booth
User
Beiträge: 44
Registriert: Mittwoch 31. Oktober 2007, 21:30
Wohnort: Durham, U.K.

Freitag 6. Februar 2009, 00:23

Hoffe die Schilderung ist nicht zu konfus:

Im Wesentlichen moechte ich regulaere Ausdruecke auf einen String, der von einem Labview-Programm erzeugt wird, loslassen. Der String sieht zum Beispiel so aus: pattern(10,100,8,var1,2,3,4*t,5,6,7,7). Ich moechte jetzt die Werte (alles zw. den Klammern) nehmen und weiter verarbeiten (heisst zB. 10 ist die Dauer einer Sequenz und 100 die Einheit in µs, daher sind das dann nachher 10 Zeitschritte in die die Daten als 10x9 Array geschrieben werden).

Und weil ich das sehr sehr oft machen muss moechte ich dazu nicht Labview benutzen. Wenn die Sequenzen laenger als 10s mit 100 µs Aufloesung werden, dann gibt es irgendein Speicherproblem mit Labview (8.0) und selbiges stuerzt ab.

Daher moechte ich das extern bearbeiten: String rein, Array raus (oder noch besser Array Pointer raus, wenn das geht).

Cheerio.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Freitag 6. Februar 2009, 10:47

Ich versteh leider überhaupt nix. Kannst du dein Problem vielleicht nochmal anders beschreiben?
Ansonsten ist numpy vieleicht was für dich. Damit kann man allerlei numerische Berechnungen mit Arrays vollführen. U. A. könnte man auch einen (C-)Array nach einer bestimmten Vorgabe erstellen und einen Pointer darauf bekommen (wobei du um diesen zu nutzen, natürlich aus dem selben Prozess zugreifen müsstest). Vieleicht kannst du deine Berechnungen mit numpy auch komplett in Python durchführen.
Du kannst auch den Python Interpreter in ein C Programm einbetten, falls nichts anderes mehr hilft.

MFG HerrHagen
booth
User
Beiträge: 44
Registriert: Mittwoch 31. Oktober 2007, 21:30
Wohnort: Durham, U.K.

Freitag 6. Februar 2009, 11:16

OK, sorry war wohl zu konfus. :roll:

Ich benutze LabView fuer die Steuerung eines Experimentes. Ich habe 2 Karten im Computer: 1 analoge Karte mit 8 Kanaelen, eine digitale mit 32 TTL ausgaengen. Mit LabView habe ich ein Frontend gebastelt mit dem man die Werte der Kanaele/TTL eingeben kann. Die Analogwerte sind beliebige Strings, die TTL-Werte ein Array aus Bool. Aus diesen Daten wir ein String gebaut, der eben die Form "pattern(10,100,TTL-Wert,AO1,AO2, usw)"enthaelt. Soweit so gut. Von diesem Punkt an muss ich nur noch den String weiterverarbeiten (Erster Schritt: Regulaere Ausdruecke) und das moechte ich mit regulaeren Ausdruecken in Python machen (dachte ich wenigstens).

Was ich letztendlich brauche ist eine dll (weil Labview scheinbar mit nix anderem spricht), die eine Funktion exportiert in die ich den String reinstecke. Die Funktion f(string) zerlegt string und interpretiert die Eintraege, sortiert sie um, berechnet welcher Wert zu welchem Zeitpunkt gesetzt werden muss und gibt mir das ganze als Array wieder raus (sollte natuerlich ein C-Array sein, sonst kann LabView nix damit anfangen). In dem Array gibt es soviele Zeilen wie es Zeitschritte gibt und 9 Spalten (1x32bit Zahl fuer die TTL-Kanaele und 8 Analogkanaele).

Die Details von der Funktion sind auch gar nicht so wichtig. Wenn man mit Python keinen Code basteln kann, der von anderen Programmen geladen werden kann, dann nutzt es nichts. Pyrex funktioniert in dem Zusammenhang wohl auch nicht so wie ich dachte. Wahrscheinlich muss ich das irgendwie anders realisieren. Schade drum, Python ist echt nett.

Wie man den Pythoninterpreter in C einbettet und das als dll zusammensetzt weiss ich leider nicht. Klingt aber kompliziert.
booth
User
Beiträge: 44
Registriert: Mittwoch 31. Oktober 2007, 21:30
Wohnort: Durham, U.K.

Freitag 6. Februar 2009, 11:30

Gerade das hier gefunden:

http://docs.python.org/extending/index.html

Koennte auch fuer Andere nuetzlich sein. Mal durchlesen...
Antworten