C++ in Python einbinden

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.
mulek
User
Beiträge: 11
Registriert: Montag 28. April 2008, 21:15
Kontaktdaten:

Hi da ich für ein Projekt eine dll Datei (aus C++ erzeugt) in Python einbinden soll, wollte ich hier mal fragen ob mir wer eine genau Anleitung dazu geben kann.
Wie muss ich in C++ speziell vorgehen, um eine einfache "Hello World" dll zu generieren?
Was muss ich dann in Python beachten?
lg martin
thomas15
User
Beiträge: 98
Registriert: Montag 7. April 2008, 19:07

Hi, lies dir das Tutorial durch.
Da steht auch wie man unter Win die DLLs erstellt.
Habs bisher nur für Linux gemacht.

docs.python.org/api/
http://docs.python.org/ext/ext.html

Hab da meine Informationen her.

Viel Erfolg,
Thomas

und sonst, google
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Zwar nicht 'Hello, world!', aber auch sehr anschaulich:
http://www.python-forum.de/topic-5483.html und http://www.python-forum.de/topic-7814.html
MfG
HWK
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

mein muster, musste aber selber noch mal durcharbeiten, sonst lernt man es nicht. manche sagen ,ist scheisse, aber sie funktioniert bei mir perfekt:

ich habe als erstes "dev-c++" installiert, ist auch in deutsch.

dann habe ich für dev-c++ diese muster-dll erstellt :

Code: Alles auswählen

#include <math.h>
#include <string.h>

void mult(float n, float* r) {
*r=n*3.7;
} 

void div(float n, float* r) {
*r=n/2.0;
}

void text_in(int* r) {
char text[] = "hurra, es geht !\n";
*r=text;
}

void text_out_in(char* text, int* r){
char neustr[12]=" ,doch !\0";
strcat (text,neustr);
*r=text;
}
mult > eine zahl übergeben von python, multiplizieren und wieder zurückgeben
div> eine zahl übergeben von python, dividieren und wieder zurück geben
text> ein text an python übergeben
text_out_in> einen text übergeben von python, text addieren und wieder an python zurückgeben.

ich verwende für die rückgabe immer zeiger in der dll.
habe bis jetzt mit vollem erfolg meine wünsche damit erfüllen können.

und dieses ist die dazugehörige python-datei :

Code: Alles auswählen

#!/usr/bin/env python

from ctypes import *
f =cdll.LoadLibrary("test.dll")

ff=pointer(c_float())
tt=pointer(c_char_p())
text=c_char_p("dies ist ein text")

b=c_float(10.0)
f.mult(b,ff)
print ff.contents.value

b=c_float(10.8)
f.div(b,ff)
print ff.contents.value

f.text_out_in(text,tt)
print tt.contents.value

f.text_in(tt)
print tt.contents.value
die dll habe ich so kompiliert mit dev-c++ zur "test.dll":
d:\Dev-Cpp\bin\gcc -c test.c
d:\Dev-cpp\bin\gcc -shared test.o -o test.dll
del test.o
befasse dich in python mit "c-types", ist sehr wichtig für den umgang mit dll :
http://starship.python.net/crew/theller ... orial.html


mfg
BlackJack

Das ist weder ein C++-Programm, noch funktioniert das mit der Rückgabe von lokalen Zeichenketten zuverlässig. Hilft also nicht wirklich weiter.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

war nur ein test zum kaputtreden, was hier so gerne gemacht wird :D

ob c oder c++, ist doch geschissen. ob python oder pythons , hautpsache der junge weiss um was es geht.
Zuletzt geändert von sechsrad am Dienstag 29. April 2008, 18:46, insgesamt 3-mal geändert.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

es gibt für die fragestellung soviele antworten hier im forum, dass man förmlich davon erschlagen wird. :D
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Schon ein seltsamer Humor, auf eine ernst gemeinte Frage eine falsche Antwort zu geben.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

..noch funktioniert das mit der Rückgabe von lokalen Zeichenketten zuverlässig
dann seht ihr schlaufüchse mal, das die pythonschlange die richtige drehung findet dafür, oder soll ich das wieder für euch machen :lol:
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Schon ein seltsamer Humor, auf eine ernst gemeinte Frage eine falsche Antwort zu geben.
was meinst du wohl , welch beschissenen antworten anfänger hier teilweise auf ihre fragen bekommen von fachleuten.

die hätte ich früher alle so in den arsch getreten das sie heute noch breitbeinig durch die gegend laufen.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

sechsrad hat geschrieben:was meinst du wohl , welch beschissenen antworten anfänger hier teilweise auf ihre fragen bekommen von fachleuten.
Auch wenn es völlig OT ist: ich finde schon, dass man hier durchaus kompetente und auch nette Antworten bekommt, auch als Anfänger. Vorausgesetzt, man kennt ``How To Ask Questions The Smart Way`` und wendet das auch an und zeigt ein wenig Eigeninitiative, was aber alles eigentlich Grundvoraussetzung sein sollte. Und gerade BlackJack - aber auch viele andere - geben sich wirklich viel Mühe, indem sie sich Quelltexte tatsächlich anschauen und konstruktive Kritik dazu geben. Auch wenn das eben manchmal vernichtend ausfallen kann oder deprimierend sein kann, weil man niemals auf so eine elegante und doch intuitive Lösung gekommen wäre. Zumindest mir persönlich hat das Forum sehr viel gebracht, alleine vom Lesen der anderen Threads.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

sechsrad hat geschrieben:die hätte ich früher alle so in den arsch getreten das sie heute noch breitbeinig durch die gegend laufen.
So langsam bekomme ich auch Angst vor Arthrose... :lol:
BlackJack

@sechsrad: Ob C oder C++ ist *nicht* egal weil bei C++ "name mangling" praktiziert wird um Funktionen überladen zu können. Das heisst die Funktionen heissen in der DLL unter Umständen anders als im Quelltext.

Und den Quelltext muss man nicht kaputtreden, das ist der bereits.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Außerdem ist C kein Subset von C++ mehr. Das Beispiel von oben ist doch ein Witz.

Wenn es wirklich C++ sein muss, Boost::Python ansehen. Ansonsten sei dir C ans Herz gelegt, das macht gerade mit der Python API wesentlich mehr Spaß und lässt sich dank Distutils schön Platformübergreifend kompilieren.

Als kleines Beispiel kannst du dir eine cgi.escape implementierung in C ansehen: http://dev.pocoo.org/hg/sandbox/file/10 ... xmlescape/
In dem Ordner ist die C Datei + ein setup.py fürs Kompilieren.
TUFKAB – the user formerly known as blackbird
lunar

mitsuhiko hat geschrieben:Wenn es wirklich C++ sein muss, Boost::Python ansehen. Ansonsten sei dir C ans Herz gelegt, das macht gerade mit der Python API wesentlich mehr Spaß und lässt sich dank Distutils schön Platformübergreifend kompilieren.
Vorrausgesetzt, die Zielplattform hat einen Compiler parat, was ja nicht überall der Fall ist.

@sechsrad
Es ist schon irgendwie erstaunlich: Dein Humor unterbietet das Niveau deines Quelltextes spielend... :roll:
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

lunar hat geschrieben:...Vorrausgesetzt, die Zielplattform hat einen Compiler parat, was ja nicht überall der Fall ist. ...
Nein wirklich??? Echt??? Ughhh, das hätte ich ja jetzt nicht für möglich gehalten ... boah.

:roll:
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Als kleines Beispiel kannst du dir eine cgi.escape implementierung in C ansehen: http://dev.pocoo.org/hg/sandbox/file/10 ... xmlescape/
In dem Ordner ist die C Datei + ein setup.py fürs Kompilieren.
zeig mal etwas, was mehr aufklärend ist, da steigt doch kein anfänger durch.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Um das zu verstehen, sollte es reichen, die offizielle Doku zu "Extending and Embedding" zu lesen.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

sechsrad hat geschrieben:zeig mal etwas, was mehr aufklärend ist, da steigt doch kein anfänger durch.
Das verlinkte Modul ist nicht sonderlich komplex. Das + die Dokumentation zur API ist denke ich kein schlechter Einstieg. Zumindest ich lerne gerne an Hand von realitätsnahen Beispielen.
TUFKAB – the user formerly known as blackbird
mulek
User
Beiträge: 11
Registriert: Montag 28. April 2008, 21:15
Kontaktdaten:

Hab mich an das erste Beispiel hier in diesem Thread gehalten.
Hab auc hdann mit dem gcc dieses C-Programm kompiliert und dann eine dll erzeugt.


from ctypes import *
f =cdll.LoadLibrary("test.dll")

Beim Einbinden in ein Python projekt kommt dann folgender Fehler:

Traceback (most recent call last):
File "E:\Mulek\Dokumente\Eclipse\Test\src\test.py", line 2, in <module>
f =cdll.LoadLibrary("test.dll")
File "C:\Program Files\Python\Lib\ctypes\__init__.py", line 431, in LoadLibrary
return self._dlltype(name)
File "C:\Program Files\Python\Lib\ctypes\__init__.py", line 348, in __init__
self._handle = _dlopen(self._name, mode)
WindowsError: [Error 126] Das angegebene Modul wurde nicht gefunden


Was hab ich falsch gemacht?
Muss ich sonst noch irgendeine Vorarbeit leisten, damit dies funktioniert?
Gibt es vl Probleme mit Windows Vista diesbezüglich?
Antworten