mikrocontroller.net

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.
Autor: Oleg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oleg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lieber nicht, JS möchte ich nicht benutzen.

Autor: rztrzeru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde mal hier ansetzen:

Oleg schrieb:
> zlib not available

Autor: Oleg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sheeva P. (sheevaplug)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Oleg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sven B. (scummos)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Vincent H. (vinci)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.