Comment intégrer Python dans une application C++ Builder / Delphi 2010?

je suis intéressé à expérimenter l'intégration de Python dans mon application, pour permettre à l'utilisateur d'exécuter des scripts Python dans l'environnement de l'application, d'accéder à des objets internes (c++-implémenté), etc. Je suis assez nouveau à cette sorte ne sais pas exactement ce que je fais.

j'ai lu intégration de Python dans une autre Application , bien que cela semble ne parler que D'API C et de fonctions C plates, pas de classes ou d'objets (sauf si j'ai manqué quelque chose) et sa section "Embedding Python in C++" ne fait que deux phrases. Cependant, je suis également tombé sur comment utiliser boost::python et cela semble excellente.

il y a un problème: boost::python n'est pas supporté par C++ Builder 2010 .

donc, étant donné cela, Quelle est la meilleure approche pour intégrer Python dans une application c++ compilée avec C++ Builder 2010, et, en utilisant quelle que soit la technique la plus appropriée, comment exposez-vous / intégrez-vous les classes et les objets pour donner au codeur Python l'accès aux internes orientés objet d'un programme? ai-je manqué une approche standard? Exposer des classes internes ou des objets instanciés à Python en tant qu'objets est-il facile, ou l'API est-elle vraiment c-style ou flat / non-OO, et si oui, quelle est la meilleure approche pour imiter une couche oo sous-jacente à travers une telle API?

Note: j'utilise en fait RAD Studio, qui comprend C++ Builder et Delphi. Il est peut-être possible d'utiliser une sorte de reliure propre à Delphes, mais celles que j'ai rencontrées sont , six ou sept ans , ou sont nouvelles-ish (Python 2.6) mais ne semblent pas avoir de documentation et ont des commentaires dans la liste des sujets comme "N'importe qui lit thiese [sic] commentaires de toute façon? Toute personne travaillant sur ce projet?" qui n'est pas encourageant. Mais s'il vous plaît n'hésitez pas à inclure Delphi - réponses spécifiques surtout si vous pensez qu'il est probable qu'ils fonctionneront dans une application combinée d+CB. J'apprécie toutes les réponses même si elles ne sont pas tout à fait parfaites - je peux faire des recherches, j'ai juste besoin de conseils sur où aller. Une solution native C++ serait probablement idéale, cependant, puisque l'utilisation d'objets dérivés de VCL a ses propres limites.

Merci pour votre contribution!

7
demandé sur David M 2010-08-10 11:13:45

3 réponses

vous ne devez pas avoir peur du projet P4D chez google groups. Il semble inactif en raison, en partie, il est très stable et complet déjà. Ces composants sont utilisés dans l'application beaucoup plus active PyScripter qui est l'un des meilleurs éditeurs de développement python actuellement disponibles. PyScripter est écrit en Delphi et utilise les composants P4D. En tant que tel, il présente également un exemple très complet de la façon d'utiliser les composants P4D, bien que le les exemples fournis avec la vérification des sources P4D sont déjà assez bons pour commencer.

8
répondu Caleb Hattingh 2010-08-10 09:42:17

Est d'exposer les classes internes ou objets instanciés à Python que objets easy, ou L'API est-elle vraiment De style C ou plat / non-OO, et si oui quelle est la meilleure approche pour imiter un la couche D'OO sous-jacente à travers une telle API?

vous avez déjà répondu vous-même. La dernière partie de la phrase est correcte.

les objets et les classes n'existent pas en C++ dès que vous compilez, seulement quelques structures (vtables), et aussi d'autres expliquant certaines données OO, à condition que RTTI soit activé. C'est pourquoi il n'est pas possible de combler le fossé entre Python et C++ en utilisant des classes et des objets.

vous pouvez construire cela sûrement par vous-même, en créant un ensemble de fonctions C avec quelques structures de données, puis un oo-layer. Mais tu ne peux pas faire ça hors des sentiers battus.

par exemple, voiture de classe:

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

se traduit par:

struct Car {
    int doors;
};

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

et un appel à getDoors:

 c->getDoors()

se traduit par:

Car_getDoors( c )
1
répondu Baltasarq 2010-08-10 08:48:08

vous pouvez générer C++ à $SCRIPTLANG wrappers avec swig .

0
répondu Rudi 2010-08-10 11:24:41