Bitte um Hilfe - Python vollständig in C++ einbinden

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
logdaten
User
Beiträge: 3
Registriert: Donnerstag 6. Januar 2011, 16:55

Hallo zusammen,

schönes Forum habt iht hier.
Mein Name ist Max und ich habe eine Frage bezüglich des Einbettens von Python in C++.
Wir arbeiten hier (kleine 3-Mann Softwarefirma in Hessen) an einem Programm, in welches wir gerne Python einbinden würden. Unser Programm wird mit Visual Studio 2008 entwickelt (kein Managed Code). Wir haben hier nun schon einige Zeit zusammengesessen und uns durch das Embeddedbeispiel im Sourcefile von Python 2.7.1 gelesen, sowie im Netz geforscht. Leider finden wir immer nur Anleitungen und Beispiele, die eine Pythoninstallation beim User voraussetzen. Wir würden aber gerne Python vollständig einbinden, sodass der User keine zusätzlich Installation machen muss.
Ich würde nun gerne wissen, ob das generell möglich ist und ob sich der Aufwand im Rahmen hält.
Es sei nebenbei noch bemerkt, das wir die Möglichkeit habe, .dlls in .libs umzuwandeln - daran solls also nicht scheitern.

Vielen Dank im voraus für eure Mühe.

Gruß
Max
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Gute Nachrichten: Das ganze ist einfacher möglich als du vermutlich denkst :)

Alles was du benötigst befindet sich in der Source Distribution im Verzeichnsi "Lib". Diesen Ordner kopierst du als "Basis".
Danach lädst du dir die Python Installation herunter und installierst diese. Im Ordner "DLLs" in der Python Installation findest du alle benötigten Dateien. Die Lib-Dateien, die zum Linken verwendet werden müssen, findest du im Ordner "libs". Die Dateien aus dem Ordner "DLLs" kopierst du nun in deinen Projektordner nach "plat-win/" (erstellen, kannst ihn auch anders nennen).

Jetzt stellst du in den Projektoptionen ein, dass die python27.dll verzögert geladen werden muss ("DELAYEDLOADING"). Du suchst nun beim Programmstart nach dem Pfad / erstellst diesen, und lädst die python27.dll aus dem "plat-win" Ordner via WinAPI mit "LoadLibrary". Alle benötigten Funktionen & Typen kannst du dir nun via GetProcAddress holen.

Problem: Es gibt Probleme beim linken. Deshalb musst du einige Sachen aus der DLL laden: http://www.python-forum.de/pastebin.php?mode=view&s=120

Edit: Natürlich kannst du dir den Quak mit dem Delayed Loading auch sparen, dann kannst du einfach ganz normal linken. Aber dann musst du die Dateien aus dem "DLLs" Ordner in den gleichen Ordner packen, in der deine spätere .exe-Datei liegen wird.

Gruß
Grüßle.
logdaten
User
Beiträge: 3
Registriert: Donnerstag 6. Januar 2011, 16:55

Oh, vielen, vielen Dank.
Das hört sich ja sehr gut an.
Ich werde das heute Abend gleich mal ausprobieren und meinen Erfolg (hoffentlich!) hier mitteilen.
Mal sehen, ob es auch klappt, die benötigten .dll als .lib einzubinden.

Nochmals Danke.

Gruß
Max
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Ach ja. Der eigentliche Grund, warum ich damals die Lösung mit dem Delayed Loading bevorzugt habe, war, dass ich explizit auf meine Python-Installation linken konnte. Es gab zum Beispiel Probleme, wenn ein Benutzer Python bereits in einer anderen Version installiert hatte, da dann meist diese bevorzugt wurde. So kann es sein, dass Python 2.5 benutzt wird, obwohl du eigentlich 2.7.1 voraussetzt.

Gruß
Grüßle.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Und das obwohl der, uhm in Unix-Speak SONAME anders ist? Schließlich wird Windows keine python25.dll laden, wenn nach einer python27.dll gefragt wird.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Das ist eine Sache, die ich so natürlich übersehen habe. Denn hat man Probleme mit diesem Fall, wenn man 2.7.1 benötigt, aber 2.7 aus der User-Installation geladen wird. Am Problem ändert das ja nichts :wink:
Grüßle.
logdaten
User
Beiträge: 3
Registriert: Donnerstag 6. Januar 2011, 16:55

Sooo, ich möchte mich nochmal bedanken.
Ich habe es nun geschafft, Python 2.7.1 vollständig in eine andere .exe einzubetten.
Vollständig heißt, es wird keine .dll oder sonstige Datei mehr benötigt (also nur die reine .exe) und der Interpreter funktioniert tadellos. Wir werden das nun auch in der Firma so verwenden.

Vielen Dank für eure Hilfe.

Gruß
Max
Antworten