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:

Montag 28. April 2008, 21:20

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

Montag 28. April 2008, 23:16

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

Dienstag 29. April 2008, 08:07

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

Dienstag 29. April 2008, 13:56

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

Dienstag 29. April 2008, 14:08

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

Dienstag 29. April 2008, 18:39

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

Dienstag 29. April 2008, 18:42

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

Dienstag 29. April 2008, 18:47

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

Dienstag 29. April 2008, 18:49

..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

Dienstag 29. April 2008, 18:53

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

Dienstag 29. April 2008, 19:01

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: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dienstag 29. April 2008, 19:03

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

Dienstag 29. April 2008, 20:18

@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:

Mittwoch 30. April 2008, 10:11

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

Mittwoch 30. April 2008, 14:20

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:
Antworten