Seite 1 von 2
c++ DLL Import
Verfasst: Dienstag 4. August 2009, 07:40
von sevelen
Schönen guten morgen zusammen,
ich beschäftige mich zzt mit der Möglichkeit c++ DLL´s direkt in Python einzubinden. Hierzu habe ich auch schon einige zeit mit google verbracht. Allerdings mit mäßigem Erfolg.
Hierzu habe ich nun ein paar fragen und hoffe das sie mir jemand beantworten kann. Weil es scheint für mich nicht so einfahc zu sein c++ DLL´s direkt in Python einzubinden.
1) Kann man jede c++ DLL in Python einbinden
2) Gibt es eine Möglichkeit für diese DLL´s auch Intellisense unter Eclipse zu bekommen. Bissher funktioniert es generell allerdings eben nicht für eingeladene DLL´s.
Grüße
Verfasst: Dienstag 4. August 2009, 11:31
von HWK
Zu 1) Ob wirklich jede DLL, weiß ich nicht. Bei den meisten sollte es aber mit ctypes klappen. Wo liegt denn Dein Problem? Hast Du eine bestimmte DLL, auf die Du nicht zugreifen kannst? Zeig dann doch mal etwas Beispiel-Code.
Zu 2) Ich habe keine Ahnung von Eclipse.
MfG
HWK
Verfasst: Dienstag 4. August 2009, 11:54
von sevelen
Ich habe eine DLL die ich ursprünglich für c++ 2005 verwende eingebunden. Die DLL an sich funktioniert aus c++ wunderbar.
import ctypes
from ctypes import *
mydll = cdll.meineDLL
mydll
Ich bekomme keinen fehler. Allerdings habe ich nun weder im intellisense wenn ich mydll. schreibe meine functionen noch wenn ich sie versuche sie direkt anzusprechen. Dann bekomme ich allerdings einen fehler das die funktion nicht bekannt ist.
Verfasst: Dienstag 4. August 2009, 12:00
von lunar
Man kann mit ctypes keine C++-Bibliotheken einbinden. C++-Klassen und -Methoden haben viel kompliziertere Aufrufkonventionen, selbst bei einfachen Funktionen ist es pures Glück, wenn der C++-Compiler sich an C-Aufrufkonventionen hält.
Um C++ einzubinden, führt kein Weg an manuell oder automatisch (mit Boost.Python, SIP oder SWIG) geschriebenen Anbindungen vorbei.
Verfasst: Dienstag 4. August 2009, 12:07
von sevelen
ups, das natürlich gemein. Hast du zufällig ein Beispiel für mich wie es stattdessen funktioniert?
Verfasst: Dienstag 4. August 2009, 12:13
von HWK
lunar hat geschrieben:Man kann mit ctypes keine C++-Bibliotheken einbinden.
Unter Umständen evtl. doch:
http://mail.python.org/pipermail/python ... 00486.html
MfG
HWK
Verfasst: Dienstag 4. August 2009, 12:36
von lunar
@HWK: Man bindet in einem solche Fall keine C++-Bibliothek ein, weil eine solche Bibliothek von außen keine C++-Bibliothek mehr ist. extern "C" zwingt den C++-Compiler, für die im Block enthaltenen Symbole die C-Aufrufkonventionen zu beachten. Der Compiler ist damit faktisch auf C beschränkt.
C++-Spezifika wie Klassen, virtuelle Funktionen und dergleichen kann man damit nicht exportieren. Selbst bei einfachen Funktionen, die (Zeiger auf) Klassenexemplare zurückgeben, dürfte das nicht funktionieren.
Verfasst: Dienstag 4. August 2009, 12:44
von HWK
Möglicherweise würde aber sevelens DLL trotz eingeschränkter Aufrufkonventionen funktionieren. Das wäre dann ja die einfachste Variante, Zugriff auf seine DLL zu bekommen.
MfG
HWK
Verfasst: Dienstag 4. August 2009, 12:44
von sevelen
Okey ich brauche allerdings die volle c++ funktionallität. Daher wie funktioniert das ganz praktisch mit boost? Habe ich bissher noch nix von gehört.
Verfasst: Dienstag 4. August 2009, 12:52
von HWK
Hier sollte es reichlich Infos geben.
MfG
HWK
Verfasst: Mittwoch 5. August 2009, 10:01
von sevelen
Hallo zusammen,
ich muss nochmal nerven
ich habe das jetzt ersteinmal mittels DLLexport und .def file versucht. erstmal sieht es auch gut aus ich bekomme zumindest keine compiler fehler beim ausführen.
Allerdings bin ich mir nicht sicher ich gebe in der dll einen wert mittels return zurück. Diesen würde ich im Python gerne sehen. Allerdings bekomme ich immer nur die speicheradresse angezeigt (test <_FuncPtr object at 0x00A22B70>)...
import ctypes
from ctypes import *
mydll = cdll.meinedll
ret = mydll.meinefuntion
print "test" , ret
Verfasst: Mittwoch 5. August 2009, 10:17
von cofi
sevelen hat geschrieben:ich muss nochmal nerven

Dafuer ist das Forum da.
sevelen hat geschrieben:
Allerdings bin ich mir nicht sicher ich gebe in der dll einen wert mittels return zurück. Diesen würde ich im Python gerne sehen. Allerdings bekomme ich immer nur die speicheradresse angezeigt (test <_FuncPtr object at 0x00A22B70>)...
import ctypes
from ctypes import *
mydll = cdll.meinedll
ret = mydll.meinefuntion
print "test" , ret
Du solltest die Funktion auch ausfuehren

Verfasst: Mittwoch 5. August 2009, 10:29
von sevelen
Hä wie ausführen. Tue ich das nicht? Sry in sachen Python bin ich noch nicht so ein alter hase quasi meine ersten gehversuche.
Verfasst: Mittwoch 5. August 2009, 10:34
von HWK
Code: Alles auswählen
>>> a = cdll.msvcrt
>>> a.printf
<_FuncPtr object at 0x011A0648>
>>> a.printf('Hallo')
5
MfG
HWK
Verfasst: Donnerstag 6. August 2009, 09:05
von sevelen
Also so langsam komm ich der sache näher. Mitlerweile bekomme ich schon werte aus der DLL rübergeschickt. Was mir allerdings noch probleme macht ist das schicken von parametern an die DLL.
Ich versuche es so, ist das falsch?
mydll.function2(1)
der wert wird in c++ als int erwartet. Ich habe auch schon..
mydll.function2(c_int(1))
...ausprobiert.
Bekomme aber immer,
"ValueError: Procedure called with not enough arguments (4 bytes missing) or wrong calling convention"
Verfasst: Donnerstag 6. August 2009, 11:50
von sevelen
Ok das vorherrige Problem habe ich gelösst mittels windll statt cdll.
Allerdings habe ich ein neues komisches phänomen.
Ich habe in meiner DLL eine funktion welche Daten einläd und in ein Array packt (alles innerhalb der c++ DLL)
Der erste Python aufruf machts nichts anderes als die daten einzuladen. Jetzt starte ich den zweiten Aufruf (aus Python) welcher mit einen speziellen Datensatz zeigen soll. Jetzt habe ich das gefühl das dass Array wieder leer ist?
Erzeugt Python bei jedem neuen kommando eine neue Instanz von der DLL?
Verfasst: Donnerstag 6. August 2009, 12:44
von HWK
Etwas Code wäre durchaus hilfreich.
MfG
HWK
Verfasst: Donnerstag 6. August 2009, 12:56
von sevelen
import ctypes
from ctypes import *
mydll = windll.LoadLibrary('meinedll.dll')
mydll.ladedaten()
mydll.schreibedaten()
Schreibt mir eine leere Datei..... Führe ich nachdem einlesen sofort das schreiben in der DLL aus klappt es wunderbar.
Verfasst: Donnerstag 6. August 2009, 12:59
von HWK

Sehr hilfreich.
MfG
HWK
Verfasst: Donnerstag 6. August 2009, 13:06
von sevelen
Mehr Python code ist es zzt nicht wiegesagt ich teste nur die verschiedenen funktionen.
Interessant is wie meine Frage auch war, ob Python mit jedem auffruf der mydll eine neue instance erzeugt oder ob es wie in c mit "mydll = windll.LoadLibrary('meinedll.dll') " erzeugt wird und dann bleibt.