Python einbinden in C Programm
-
Ich würde mich dem Thread gerne anschließen, zumal ich auch boost.python verwende.
Meine Frage ist nun wenn ich alles brav kompiliert habe und nun ein EXE file zu Verfügung habe, was brauche ich alles damit ich die Python Scripts ausführen kann?
Gehen wir von meiner Situation aus, das auf dem anderen Host/Rechner nichts installiert werden darf/kann.
Dachte da an ein Zipfile oder so wo die benötigten sachen für Python drinnen sind und beim Programmstart entpacke ich einfach dieses Zip Archiv. Nur was benötigt Python alles?Lg _freeze_
-
Im Prinzip nichts. Der Interpreter wird mit einkompiliert, du musst nur die verwendeten Module beifügen.
-
DonnerCobra schrieb:
Boost ist eine Bibliothek die mir den Zugang zu Python vereinfacht, korrekt? Und Boost ist nicht standardmäßig in Python mit drin sondern muss seperat heruntergeladen werden!?
Boost und Python haben im ersten Moment nichts miteinander gemeinsam. Boost ist eine Bibliothekssammlung die unter anderem (neben sehr vielen mehr) auch eine Bibliothek für Python hat. Imho sollte jeder der sich ernster mit C++ auseinander setzt auch Boost kennen.
cu André
-
Genau die Module meinte ich. Da bei meiner Applikation jeder Benutzer selbst skripte erstellen kann wollte ich wissen was ich alles brauche. Gehen wir von dem schlimmsten aus, das irgendwann alles gebraucht wird. Genügt es das "C:\Python25\Lib" Verzeichnis zu packen und mitzugeben? oder benötigt man sonst noch was ausser das Lib Verzeichnis?
Lg _freeze_
P.S.: Da hier anscheinend mehrere Leute sind die sich mit Python bzw. Boost.Python gut auskennen. Wie bekomme ich den Backtrace in eine Variable? Für Konsolen Anwendungen passt das ausgeben ja eh. Was aber wenn man eine GUI entwickelt, da wäre der Backtrace in einer MessageBox oder was auch immer nicht schlecht.
-
freeze schrieb:
Genau die Module meinte ich. Da bei meiner Applikation jeder Benutzer selbst skripte erstellen kann wollte ich wissen was ich alles brauche. Gehen wir von dem schlimmsten aus, das irgendwann alles gebraucht wird. Genügt es das "C:\Python25\Lib" Verzeichnis zu packen und mitzugeben? oder benötigt man sonst noch was ausser das Lib Verzeichnis?
Ich bezweifle, dass du alles daraus brauchst. Da sind ja bestimmt auch Sachen drinne, die dein Programm torpedieren könnten, die musst du nun nicht mitliefern. Außerdem vereinfacht sich die Sache für dich, wenn du nur echte Python-Bibliotheken (keine DLLs) mitnimmst. Wie das ganze lizenztechnisch ist weiß ich aber auch nicht.
Treff halt ne sinnvolle Vorauswahl, der Benutzer kann sich den Rest selbst zusammensuchen. Du musst den Pfad übrigens in deinem Programm dann zu sys.path hinzufügen (kannst ja mal schauen, ob das mit der C-API geht, ansonsten einfach per exec oder mit import("sys").attr("path") += str("pfad")).Da hier anscheinend mehrere Leute sind die sich mit Python bzw. Boost.Python gut auskennen. Wie bekomme ich den Backtrace in eine Variable? Für Konsolen Anwendungen passt das ausgeben ja eh. Was aber wenn man eine GUI entwickelt, da wäre der Backtrace in einer MessageBox oder was auch immer nicht schlecht.
-
.filmor schrieb:
Ich meinte C/C++ technisch, ausgehend von der Python C Api beispielsweise:
try { . . . }catch(PythonFehler &e) { PyErr_Print(); MessageBox("HIER KOMMT DER PYTHON FEHLER (BACKTRACE) REIN"); }Lg _freeze_
-
catch (bp::error_already_set const&) { bp::str blubb = bp::import("sys").attr("stderr").attr("data"); // mit blubb rumspielen, zB zu std::string konvertieren oder sowas }
-
@.filmor: Danke werde die Fehlerbehandlung mal so probieren.
Jedoch zu meinem vorherigen Posting war noch keine klare Aussage getroffen worden. genügt es das ganze bzw. Teile vom Lib Verzeichnis mitzugeben oder brauche ich sonst noch etwas? Habe auch irgendwo mal gelesen das es genügt ein Zip file zu generieren da Python in das Zip file schaut. Hast Du damit vielleicht schon erfahrung gesammelt?
Lg _freeze_
-
Das Thread-Hijacking hier läuft langsam ein bisschen aus dem Ruder

Die nächste Frage bitte in nem eigenen Thread.Wie ich schon sagte, der Interpreter wird mit einkompiliert (wenn es dynamisch gelinkt wird muss selbstverständlich die python.dll und boost_python.dll bzw. so beiliegen).
Ansonsten wird nichts weiter benötigt. Die Teile der Bibliothek, die du für sinnvoll erachtest (!= die gesamte Laufzeitbibliothek!) kannst du in ein zusätzliches Unterverzeichnis lib tun, dass dann beim Programmstart Python bekannt gemacht wird (also zu sys.path hinzugefügt wird).Ich weiß nicht, ob Python von Hause aus in .zip-Dateien nach Modulen schauen kann, aber ich denke, dass man diese Verhalten nachrüsten könnte (Stichwort __import__).
-
Vielen Dank für Deine Antwort,
werde bei meiner nächsten Frage einen neuen Thread eröffnen.

Nichts für ungutLg _freeze_
-
Kann man das gleiche Prinzip mit pyQt auch anwenden? Ich möchte folgendes Python beispiel in c++ integrieren...
beispiel:
import sys from qt import * class HelloButton(QPushButton): def __init__(self, *args): apply(QPushButton.__init__, (self,) + args) self.setText("Hello World") class HelloWindow(QMainWindow): def __init__(self, *args): apply(QMainWindow.__init__, (self,) + args) self.button=HelloButton(self) self.setCentralWidget(self.button) def main(args): app=QApplication(args) win=HelloWindow() win.show() app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()")) app.exec_loop() if __name__=="__main__": main(sys.argv)