Ich bin grade dabei, in Qt eine Applikation zu schreiben, bei der der User die Möglichkeit haben soll, eine Art "Makro" selber schreiben zu können, um die Applikation nach eigenen Wünschen erweitern zu können. Dazu habe ich gelesen, dass man Python 'embedden' kann, also es wird der Python Interpreter statisch zu meiner Applikation dazu gelinkt, sodass man nur noch in einer Zip-Datei die Library mit liefern muss. Die Idee habe ich von hier: https://ubuverse.com/embedding-the-python-interpreter-in-a-qt-application/ Ich habe das nun nachzuvollziehen versucht. Im Moment arbeite ich unter Linux, aber am Ende soll meine Applikation auch unter Win laufen, was mir bisher gelungen ist, ich hoffe, dass dies mir auch mit Python gelingen wird ;-) So, ich habe nun alles wie in meinem Link angegeben gemacht, und mein Code compiliert sauber und ohne Warnungen. Allerdings stürzt mein Programm ab, wenn ich Py_InitializeEx(0); ausführe, mit der Fehlermeldung: Could not find platform independent libraries <prefix> Could not find platform dependent libraries <exec_prefix> Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>] Fatal Python error: initfsencoding: Unable to get the locale encoding zipimport.ZipImportError: can't decompress data; zlib not available Was muss ich da ändern? ich verstehe das Problem nicht ganz. Da ich nicht dieses komische CSS-Programm aus dem Beispiel nutzen möchte, habe ich einfach den Lib-Ordner meines heruntergeladenen Python-Sourcecodes in eine Zip-Datei gepackt und zu meiner Applikation in den selben Ordner gelegt. Das müsste doch funktionieren?
Wären denn die bei Qt schon mitgelieferten Skripting-Möglichkeiten keine Option? Die sind auch schon sehr schön und komfortabel an Qt angebunden. Da gäbe es Qt Script (ist aber deprecated) und QJSEngine. Siehe z.B. http://doc.qt.io/qt-5/qjsengine.html
So, ich habs jetzt geschafft, dass es nicht nur compiliert, sondern auch läuft. Ich kann sogar externe Python-Skripte aufrufen, sowie C++ Funktionen aufrufen und Werte austauschen, zumindest habe ich das schon getestet für ints und Strings. Habe aber noch 2, 3 Fragen: a) wie kann ich mit der C++ Applikation eine Liste zu Python austauschen, oder eine Liste aus Python als Rückgabewert erhalten? also z.B. den Returnwert von def func: return [1, 2, 3] in C++ dann auswerten? b) wie bekomme ich es hin, dass mein Qt-Projekt immernoch plattformunabhängig ist, d.h. ich es unter Win und Linux compilieren kann? was muss ich da beachten? Ich denke, ich muss Python auch unter Windows dann noch compilieren und die .lib Datei erstellen und dazu linken, aber ich brauche ja auch noch zlib usw., was muss ich da alles beachten?
Oleg schrieb: > Habe aber noch 2, 3 Fragen: > > a) wie kann ich mit der C++ Applikation eine Liste zu Python > austauschen, oder eine Liste aus Python als Rückgabewert erhalten? also > z.B. den Returnwert von > > def func: > return [1, 2, 3] > > in C++ dann auswerten? Das steht in der Dokumentation. ;-) Ansonsten: https://www.boost.org/doc/libs/1_67_0/libs/python/doc/html/index.html > b) wie bekomme ich es hin, dass mein Qt-Projekt immernoch > plattformunabhängig ist, d.h. ich es unter Win und Linux compilieren > kann? was muss ich da beachten? Ich denke, ich muss Python auch unter > Windows dann noch compilieren und die .lib Datei erstellen und dazu > linken, aber ich brauche ja auch noch zlib usw., was muss ich da alles > beachten? Du kannst ein fertiges Python für Windows benutzen, mußt es also nicht selbst übersetzen. Aber alle Libraries, die Dein C++- und Deine Python-Programme anziehen, müssen natürlich mitdeployt werden.
Hallo allerseits so ich habe es geschafft. Habe meinem Qt-Projekt die Python-Library hinzugefügt, die Standard-Library wird als Zip geladen. Mein Code kompiliert sowohl unter Windows als auch unter Linux und läuft auf beiden Plattformen identisch. Ich kann Funktionen aus Python heraus aufrufen und Objekte zurück geben, und ich kann von Python heraus Funktionen in C++ aufrufen und Objekte an Python zurück geben. Aufrufe auf print() oder dergleichen aus Python drucken ihren Text in eine kleine Textbox auf meinem GUI aus. Es ist wahrlich kein Hexenwerk, wenn auch z.T. aufwendig. Ich frage mich, ob es eine Möglichkeit gäbe, einen ganz einfachen Python-Interpreter in C++ zu schreiben, und diesen direkt in meinem Projekt hinzuzufügen, damit ich nicht zur Python-Library linken muss. Ich brauche im Prinzip nicht alle Fähigkeiten von Python, ich will nur so paar ganz einfache Sachen wie listen, Tupel und sowas verarbeiten können. Ginge sowas wohl mit einigermassen vertretbarem aufwand? wie könnte man einen simplen Interpeter, der eine Python-Syntax nutzt, selber implementieren?
Oleg schrieb: > Ich frage mich, ob es eine Möglichkeit gäbe, einen ganz einfachen > Python-Interpreter in C++ zu schreiben, und diesen direkt in meinem > Projekt hinzuzufügen, damit ich nicht zur Python-Library linken muss. > Ich brauche im Prinzip nicht alle Fähigkeiten von Python, ich will nur > so paar ganz einfache Sachen wie listen, Tupel und sowas verarbeiten > können. > > Ginge sowas wohl mit einigermassen vertretbarem aufwand? wie könnte man > einen simplen Interpeter, der eine Python-Syntax nutzt, selber > implementieren? Lass es, das lohnt nicht. Du kannst schon sowas schreiben aber es wird einen Haufen Bugs haben. Du willst Python, nimm Python. Wenn dir Python zu groß ist, nimm, keine Ahnung, Lua oder so. Oder QtScript.
Vielleicht kann ma den Micropython Interpreter anhängen, wenn man die vollständige Implementierung nicht braucht? Der sollte im wesentlichen ja auf Code-Size optimiert sein.
Hallo, ich versuche auch Python in C++ einzubetten. Allerdings komme ich nicht gaz mit dem Tutorial klar. Ich erstelle mein Qt-Programm unter Windows und komme an folgender stelle nicht weiter. https://ubuverse.com/embedding-the-python-interpreter-in-a-qt-application/ INCLUDEPATH += /usr/include/python3.4m LIBS += -L/usr/lib/x86_64-linux-gnu LIBS += -Wl,-Bstatic -lpython3.4m -Wl,-Bdynamic LIBS += -lz -lexpat -ldl -lutil Python konnte ich mit Windows Pfaden ersetzen. Die folgende Libs sind mir allerdings ein Rätsel, wie ich diese verstehen und übersetzen kann damit sie funktionieren. Hat jemand Verständnis für diese Befehle und kann sie mir erklären und ein synonym für Windows geben. Mit freundlichen Grüßen Maik
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.