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
C++ in Python einbinden
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
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
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
http://www.python-forum.de/topic-5483.html und http://www.python-forum.de/topic-7814.html
MfG
HWK
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 :
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 :
die dll habe ich so kompiliert mit dev-c++ zur "test.dll":
http://starship.python.net/crew/theller ... orial.html
mfg
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;
}
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
befasse dich in python mit "c-types", ist sehr wichtig für den umgang mit dll :d:\Dev-Cpp\bin\gcc -c test.c
d:\Dev-cpp\bin\gcc -shared test.o -o test.dll
del test.o
http://starship.python.net/crew/theller ... orial.html
mfg
Das ist weder ein C++-Programm, noch funktioniert das mit der Rückgabe von lokalen Zeichenketten zuverlässig. Hilft also nicht wirklich weiter.
war nur ein test zum kaputtreden, was hier so gerne gemacht wird
ob c oder c++, ist doch geschissen. ob python oder pythons , hautpsache der junge weiss um was es geht.
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.
was meinst du wohl , welch beschissenen antworten anfänger hier teilweise auf ihre fragen bekommen von fachleuten.Schon ein seltsamer Humor, auf eine ernst gemeinte Frage eine falsche Antwort zu geben.
die hätte ich früher alle so in den arsch getreten das sie heute noch breitbeinig durch die gegend laufen.
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.sechsrad hat geschrieben:was meinst du wohl , welch beschissenen antworten anfänger hier teilweise auf ihre fragen bekommen von fachleuten.
@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.
Und den Quelltext muss man nicht kaputtreden, das ist der bereits.
-
- 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.
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
Vorrausgesetzt, die Zielplattform hat einen Compiler parat, was ja nicht überall der Fall ist.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.
@sechsrad
Es ist schon irgendwie erstaunlich: Dein Humor unterbietet das Niveau deines Quelltextes spielend...
zeig mal etwas, was mehr aufklärend ist, da steigt doch kein anfänger durch.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.
- 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.
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
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.sechsrad hat geschrieben:zeig mal etwas, was mehr aufklärend ist, da steigt doch kein anfänger durch.
TUFKAB – the user formerly known as blackbird
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?
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?