Seite 1 von 2

C++ in Python einbinden

Verfasst: Montag 28. April 2008, 21:20
von mulek
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

API Dokumentation lesen &&

Verfasst: Montag 28. April 2008, 23:16
von thomas15
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

Verfasst: Dienstag 29. April 2008, 08:07
von HWK
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

Verfasst: Dienstag 29. April 2008, 13:56
von sechsrad
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

Verfasst: Dienstag 29. April 2008, 14:08
von BlackJack
Das ist weder ein C++-Programm, noch funktioniert das mit der Rückgabe von lokalen Zeichenketten zuverlässig. Hilft also nicht wirklich weiter.

Verfasst: Dienstag 29. April 2008, 18:39
von sechsrad
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.

Verfasst: Dienstag 29. April 2008, 18:42
von sechsrad
es gibt für die fragestellung soviele antworten hier im forum, dass man förmlich davon erschlagen wird. :D

Verfasst: Dienstag 29. April 2008, 18:47
von EyDu
Schon ein seltsamer Humor, auf eine ernst gemeinte Frage eine falsche Antwort zu geben.

Verfasst: Dienstag 29. April 2008, 18:49
von sechsrad
..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:

Verfasst: Dienstag 29. April 2008, 18:53
von sechsrad
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.

Verfasst: Dienstag 29. April 2008, 19:01
von Trundle
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.

Verfasst: Dienstag 29. April 2008, 19:03
von EyDu
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:

Verfasst: Dienstag 29. April 2008, 20:18
von 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.

Verfasst: Mittwoch 30. April 2008, 10:11
von mitsuhiko
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.

Verfasst: Mittwoch 30. April 2008, 14:20
von 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:

Verfasst: Donnerstag 1. Mai 2008, 11:13
von Masaru
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:

Verfasst: Donnerstag 1. Mai 2008, 20:52
von sechsrad
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.

Verfasst: Donnerstag 1. Mai 2008, 20:56
von birkenfeld
Um das zu verstehen, sollte es reichen, die offizielle Doku zu "Extending and Embedding" zu lesen.

Verfasst: Donnerstag 1. Mai 2008, 21:25
von mitsuhiko
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.

Verfasst: Sonntag 4. Mai 2008, 10:01
von mulek
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?