Pythonbindungen erzeugen, welche Methoden / Programme zu verwenden sind

Ich bin auf der Suche mit Python (CPython) in meinem Programm, um sowohl Benutzer-Scripting in meiner Umgebung und erlauben mir, pyside verwenden, die qt Bindungen für c + +, um die GUI für meine Anwendung zu erstellen. Diese können effektiv mit der Idee getrennt werden, dass der GUI-Python-Code später für die Geschwindigkeit kompiliert werden kann (falls dies möglich wäre).

Ich bin sehr neu in Python und ich bin wirklich auf der Suche nach dem effizientesten Weg, um solide Bindungen mit dem absoluten Minimum an zusätzlichen Code zu erhalten, um zu behaupten, da die Bindungen sich wahrscheinlich oft ändern, wenn sich das Projekt entwickelt. Ich brauche es so, dass Python-Klassen C ++ – Klassen erweitern, die virtuelle haben.

Ich habe schon in PyBindGen geschaut und es drosselt zu oft auf Sachen in meiner Bibliothek, damit es praktisch nützlich ist.

Jede Hilfe / Rat / Links / Workflows, die Sie in dieser Hinsicht empfehlen, wäre sehr hilfreich.

  • PDF-Schriftart mit Skript löschen
  • Twitter-API-Bibliotheken für Desktop-Apps?
  • Steigern Sie Python, vergleichen Sie den rohen Zeiger auf den verwalteten Zeiger?
  • Reden zwischen python tcp server und einem c ++ client
  • Warum erlauben Sie die Verkettung von String-Literalen?
  • Kompilieren und Verknüpfen von C-Erweiterung für Python in Xcode für Mac
  • 5 Solutions collect form web for “Pythonbindungen erzeugen, welche Methoden / Programme zu verwenden sind”

    Es gibt nur zwei Projekte, die ich kenne, um automatische Bindungsgeneratoren für C ++ zu haben. Die erste ist SWIG. Wie eine andere Antwort schon gesagt hat, ist es ein bisschen alter Stil, aber es funktioniert. Die zweite ist Boost.Python – von selbst, es erzeugt nicht die Bindungen automatisch, aber Sie können Boost.Pyste verwenden , um es für Sie zu tun. Es erfordert GCC-XML, um Ihren ursprünglichen Quellcode zu analysieren und die Boost.Python-Bindungen zu schreiben. Beide Optionen unterstützen virtuelle Methoden in C ++, die von Python überlastet werden können.

    Das heißt, ich muss das komplizieren, normalerweise, wenn du verbindlich bist, bindet du nicht blind alles, was du in C ++ in Python hast – wenn du es so machst, bekommst du kein pythonisches Gefühl von der Pythonenseite. Stattdessen entwerfen Sie, wie Sie möchten, dass Ihre Bibliothek in Python verwendet wird, in der pythonischsten Weise, und dann gehen Sie zurück und sehen, wie man es durch Ihren C ++ – Code mit einer der möglichen Bindungsbibliotheken patch. Zum Beispiel, anstatt mit std::vector 's zu arbeiten, würden Sie lieber Ihre Bibliotheksanrufe behandeln Pythonlisten oder iterables. Wenn deine C ++ – Bibliothek eine std::map erhält, solltest du das mit Python-Wörterbüchern behandeln. Wenn es ein Array ist, wäre vielleicht ein numpy.ndarray bequemer. Und so weiter…

    Das heißt, du kannst deine Bindungen noch so gestalten, dass deine Wartung minimiert wird.

    Hier ist eine Liste von anderen Python / C ++ – Verpackungen, falls Sie sich noch etwas weiter umschauen:

    1. SWIG – wie du schon weißt
    2. Boost.Python – das ist, was wir normalerweise hier herum verwenden – ziemlich gut strukturiert
    3. Cython – sehr ordentliche Syntax in der Nähe von Python – sie behaupten, viel schneller als Boost.Python zu sein
    4. SIP – nicht sehr verbreitet, aber es ist da
    5. PyBindGen – behauptet, am schnellsten zu sein
    6. ECS: Python – neue Sachen
    7. PyCXX – C ++ – Funktionen, um es einfacher zu machen, Python-Erweiterungen zu schreiben
    8. Pybind11 – Syntax ähnlich Boost.Python, kompakte Umsetzung dank C ++ 11.

    Für die Vollständigkeit ist es auch möglich, kompilierten C-Code direkt in Python zu laden, ohne formale Bindungen zu erzeugen. Sie können dies mit FFI mit einem dieser beiden Python-Module:

    1. Ctypes – Diese native zu Python und erfordert keine externe Modulinstallation .
    2. Cffi – Dies ist ein neues Paket, das von dem gleichwertigen Design auf der Lua JIT inspiriert wurde.

    Wenn du auf der Suche nach Geschwindigkeit bist, würde ich definitiv auch für Cython abstimmen. Soweit ich über andere Möglichkeiten zur Schnittstelle von C ++ mit Python weiß, ist Cython nicht so viel schwer zu pflegen / zu aktualisieren im Vergleich zu anderen Bindungs-Tools, in Bezug auf die "Fließfähigkeit des Workflows" zu gewinnen. (Cythonized Code argumentiert so schnell wie reines C, oder nicht weit davon, was es auch sehr interessant macht).

    Jedenfalls gibt es mehrere gute APIs zum Verbinden von Python-Code mit C ++ (Boost.Python, …), aber ich denke, dass alle von ihnen dazu führen, dass die Notwendigkeit, Methoden direkt in Ihrem C ++ – Quellcode auszusetzen (Sie sagen mir, wenn ich Falsch oder unpräzise

    In der anderen Hand gibt Cython Ihnen die Möglichkeit, Ihre C ++ API (GUI, oder was auch immer …) streng von den Expositionsquellen (so genannte .pyx Erweiterungen) zu halten. Der letzte Workflow wäre:

    C ++ API => Kompilierung als gemeinsames Objekt => Cython-Erweiterung (s) (Importieren und Belichten von C ++ – Merkmalen) => Zusammenstellung der Erweiterung (en) => Verwenden der Erweiterung (Erweiterung, die Ihrem Pythonpfad hinzugefügt werden soll).

    Die gute Nachricht ist, dass du nur die wechselnden Teile deines Pools von .pyx-Dateien beibehalten musst, die sich auf die sich entwickelnden C ++ – Features beziehen (unter denen, die ausgesetzt werden müssen). Es ist irgendwie eine Investition auf den ersten, aber nach meiner Erfahrung, sobald dieser Workflow eingerichtet ist, ist es ganz einfach, das ganze Zeug in der Komplexität aufzuwachsen.

    Jetzt über deine Notwendigkeit, Klassen zu erweitern, die virtuelle haben und sie von Python überschreiben (Wenn ich richtig was du meinst). Es ist machbar. Noch einmal, nicht so direkt, aber du solltest einen Blick auf diesen Thread werfen

    Die schlechte Nachricht: In diesem Fall müssen Sie einige zusätzliche C ++ – Adapter / Schnittstellen erstellen, um den Aufruf der übergeordneten Methode zu aktivieren, wenn die erweiterte Pythonität die Methode des gegebenen Elternteils nicht überschreibt. (Beachten Sie, dass die Neudefinition einer C ++ – exponierten Methode, virtuell oder nicht, aus python ist ein Ersatz der Funktion, ist aber absolut nicht gleichbedeutend mit einem Override).

    Hummf, jetzt, wo ich mich wieder lese, sieht es ein bisschen verwirrend aus. Hoffe das ist immer noch hilfreich

    Ich kann genauer über den Workflow sein, mit dem du dich beschäftigen musst, wenn du die Cython-Option wählst, wenn du mich fragst, aber ich denke, dass der oben verknüpfte Thread ein guter Ausgangspunkt ist …

    AFAICT gibt es nicht viele Optionen mit C ++. Eines der älteren Projekte ist SWIG ; Es wird berichtet, ein wenig geheimnisvoll und klobig zu sein, aber da es schon lange her ist, sollte es auch eine Menge von Sachen abdecken, die nicht von anderen Projekten gehandhabt werden. Vielleicht möchten Sie auch Cython anschauen.

    SWIG ist ein großartiges Werkzeug, das tun kann was du willst

    http://sourceforge.net/projects/swig/

    Für moderne C ++ verwenden Sie CLIF ( https://github.com/google/clif ). Es entdeckt nicht Ihre API, Sie müssen es in Python Begriffe zu beschreiben.

    CLIF wird Ihren Header mit dem neuesten LLVM / Clang-Compiler neu kompilieren und C ++ – Quellcode für ein Python-Erweiterungsmodul erstellen.

    Es kann komplexe Datenstrukturen verstehen: def f() -> dict<str, set<int>> .

    Python ist die beste Programmiersprache der Welt.