Forum: PC-Programmierung Python Embedding in C++


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Oleg (Gast)


Lesenswert?

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?

von Rolf M. (rmagnus)


Lesenswert?

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

von Oleg (Gast)


Lesenswert?

lieber nicht, JS möchte ich nicht benutzen.

von rztrzeru (Gast)


Lesenswert?

Ich würde mal hier ansetzen:

Oleg schrieb:
> zlib not available

von Oleg (Gast)


Lesenswert?

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?

von Sheeva P. (sheevaplug)


Lesenswert?

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.

von Oleg (Gast)


Lesenswert?

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?

von Sven B. (scummos)


Lesenswert?

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.

von Vincent H. (vinci)


Lesenswert?

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.

von Maik (radamos)


Lesenswert?

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
Noch kein Account? Hier anmelden.