9
votes

Interprète Python en tant que classe C ++

Je travaille sur l'incorporation de Python à C ++. Dans un cas particulier, j'ai besoin de deux instances distinctes de l'interprète dans le même thread.

Puis-je envelopper l'interpréteur de Python dans une classe C ++ et obtenir des services de deux instances de classe ou plus?


0 commentaires

6 Réponses :


4
votes

Vous pouvez, mais je vous recommanderais de ne pas ré-implémenter un interprète Python lorsqu'il y a une mise en œuvre standard. Utilisez boost :: python pour interfacer avec python.


1 commentaires

Boost Python utilise les API Python C. Est-il possible de démarrer l'interprète deux fois en appelant py_initialize ()?



6
votes

callin py_initialize () deux fois ne fonctionnera pas bien, cependant py_newinterprètre peut fonctionner, en fonction de ce que vous essayez de faire. Lisez attentivement les documents, vous devez tenir la gil à l'appeler.


1 commentaires

Je suppose que je ne vais pas avoir une réponse directe à ma question. Votre réponse m'a donné des intrants sur lesquels je peux commencer à travailler. Py_newinterpreter semble être la bonne option pour commencer à explorer le scénario que j'ai décrit. Basé sur cela, j'accepte votre réponse.



1
votes

Je ne pense pas que vous soyez la première personne à vouloir faire cela, malheureusement, je crois que ce n'est pas possible. Êtes-vous en mesure d'exécuter les interperteurs Python comme des processus distincts et utilisez RPC?


0 commentaires

0
votes
  • Vous pouvez laisser le python interprète en dehors en direct de votre espace mémoire d'application. Il suffit de l'intégrer interprète dans une DLL.
  • Vous pouvez configurer et sauver des contextes de python pour simuler deux interprètes différents.

0 commentaires

14
votes

J'ai utilisé py_newinterpreter pour différents interprètes dans différents threads, mais cela devrait également fonctionner pour plusieurs interprètes dans un fil:

dans le fil principal: p>

PyEval_RestoreThread(mainThreadState);
Py_Finalize();


0 commentaires

2
votes

La réponse de Mosaik n'a pas fonctionné dans ma situation où mon module est un plugin à une application hôte qui initialise déjà Python. J'ai pu le faire travailler avec le code suivant. XXX

Quand j'ai appelé Pyeval_acquirelock () Le programme bloqué et la fonction ne retournée pas. En outre, appeler pyeval_releasethread (mystate) semblait invalider l'interprète également.


0 commentaires