2010-08-10 3 views
7

Ich bin daran interessiert, mit der Einbettung von Python in meiner Anwendung zu experimentieren, den Benutzer Python-Skripte innerhalb der Anwendungsumgebung ausführen zu lassen, Zugriff auf interne (C++ - implementiert) Objekte usw. Ich bin ziemlich neu, so weiß es nicht genau was ich mache. Ich habe Embedding Python in Another Application gelesen, obwohl dies scheint nur über eine C-API und flache C-Funktionen zu sprechen, nicht Klassen oder Objekte (sofern ich etwas verpasst habe) und seine "Einbettung Python in C++" Abschnitt ist nur zwei Sätze lang . Aber auch bin ich auf how to use boost::python gestoßen und das sieht hervorragend aus.Wie sollte ich Python in eine C++ Builder/Delphi 2010-Anwendung einbetten?

Es gibt ein Problem: boost :: python is not supported by C++ Builder 2010.

Was ist also der beste Ansatz für die Einbettung von Python in eine mit C++ Builder 2010 kompilierte C++ - Anwendung und wie Sie Klassen und Objekte dem Python-Coder zugänglich machen/integrieren Zugang zu den objektorientierten Einbauten eines Programms? Habe ich einen Standardansatz verpasst? Wird Python als Objekt einfach für interne Klassen oder instanziierte Objekte verfügbar gemacht oder ist die API wirklich C-style oder flat/non-OO, und wenn ja, was ist der beste Ansatz, um eine zugrunde liegende OO-Ebene durch eine solche API zu imitieren?

Hinweis: Ich verwende RAD Studio, das sowohl C++ Builder als auch Delphi enthält. Es mag möglich sein, eine Art von Delphi-spezifischer Bindung zu verwenden, aber die, denen ich begegnet bin, sind six or seven years old oder sind neu-ish (Python 2.6), aber don't seem to have any documentation und haben Kommentare in der Problemliste wie "Anyone reads thiese [sic] comments anyway? Anyone working on this project?", was nicht ermutigend ist . Aber bitte nehmen Sie Delphi-spezifische Antworten besonders dann mit, wenn Sie denken, dass sie wahrscheinlich in einer kombinierten D + CB-App funktionieren. Ich schätze alle Antworten, auch wenn sie nicht perfekt sind - ich kann recherchieren, ich brauche nur Hinweise darauf, wohin ich gehe. Eine native C++ - Lösung wäre wahrscheinlich ideal, da VCL-abgeleitete Objekte ihre eigenen Einschränkungen haben.

Vielen Dank für Ihre Eingabe!

Antwort

8

Sie sollten keine Angst vor dem P4D-Projekt bei Google-Gruppen haben. Es scheint inaktiv, weil es teilweise schon sehr stabil und voll ausgestattet ist. Diese Komponenten werden in der viel aktiveren Anwendung PyScripter verwendet, die eine der besten derzeit verfügbaren Python-Entwicklungs-Editoren ist. PyScripter ist in Delphi geschrieben und verwendet die P4D-Komponenten. Als solches stellt es auch ein sehr umfassendes Beispiel für die Verwendung der P4D-Komponenten dar, obwohl die Beispiele, die mit der P4D-Quell-Kasse bereitgestellt werden, bereits gut genug sind, um loszulegen.

+1

Ok, danke, ich habe nicht bemerkt, dass es auf der Website so stabil ist. –

1

aussetzt interne Klassen oder instanziiert Objekte Python als Objekte einfach, oder ist die API wirklich C-Stil oder Wohnung/nicht-OO, und wenn ja was ist der beste Ansatz zu imitieren ein zugrunde liegenden OO-Schicht durch eine solche API?

Sie haben sich bereits selbst geantwortet. Der letzte Teil des Satzes ist korrekt.

Objekte und Klassen existieren nicht in C++, sobald Sie kompilieren, nur ein paar Strukturen (vtables), und auch andere erklären einige OO-Daten, sofern RTTI aktiviert ist. Aus diesem Grund ist es nicht möglich, die Lücke zwischen Python und C++ mit Klassen und Objekten zu überbrücken.

Sie können das sicher selbst erstellen, indem Sie eine Reihe von C-Funktionen zusammen mit einigen Datenstrukturen und dann eine OO-Ebene erstellen. Aber das kann man nicht sofort machen.

Zum Beispiel Klasse Auto:

class Car { 
public: 
    int getDoors() 
     { return this->doors; } 
protected: 
    int doors; 
}; 

Ist übersetzt:

struct Car { 
    int doors; 
}; 

int Car_getDoors(Car * this) 
{ 
    return this->doors; 
} 

Und ein Aufruf an getDoors:

c->getDoors() 

übersetzt als:

Car_getDoors(c) 
+0

Danke ... Ich weiß, das ist grob gesagt, wie OO normalerweise implementiert wird :) Ihr sagt also im Grunde, eine OO-ähnliche Schnittstelle neu zu erstellen, indem ihr das überall hin gibt? Scheint furchtbar ungeschickt :( –

+0

Ja, es ist ungeschickt, obwohl es wie implementiert ist. Und ja, Sie sollten mit all dem beschäftigen, wenn Sie planen, Ihre eigene OO-Schnittstelle zu bauen. Es gibt keine andere Wahl abgesehen von der Verwendung einer anderen bestehenden Schnittstelle. – Baltasarq

+0

Nun, über eine andere Schnittstelle frage ich mich: Ich möchte Python/CPP-Hooks, wenn überhaupt möglich, nicht neu erstellen - wenn es ein existierendes Framework gibt, das ich mit meinem Compiler verwenden kann, das ist es, wonach ich suche Ich muss alles neu erstellen, ich werde einfach eine andere Sprache verwenden, für die es besseren Support gibt! –

0

Sie können C++ zu $ ​​SCRIPTLANG-Wrapper mit swig generieren.