Python-Interpreter als C ++ - Klasse

8

Ich arbeite an der Einbettung von Python in C ++. In einem speziellen Fall benötige ich zwei separate Instanzen des Interpreters in demselben Thread.

Kann ich Python-Interpreter in eine C ++ - Klasse einbinden und Dienste von zwei oder mehr Klasseninstanzen holen?

    
Amol Gawai 26.09.2009, 05:28
quelle

6 Antworten

14

Ich habe Py_NewInterpreter für verschiedene Interpreter in verschiedenen Threads verwendet, aber das sollte auch für mehrere Interpreter innerhalb eines Threads funktionieren:

Im Hauptthread:

%Vor%

Für jede Interpreter-Instanz (in einem beliebigen Thread):

%Vor%

Beachten Sie, dass Sie für jede Interpreterinstanz eine Variable myThreadState benötigen!

Endlich das Ziel im Hauptthread:

%Vor%

Es gibt einige Einschränkungen bei der Verwendung mehrerer Interpreter-Instanzen (sie scheinen nicht völlig unabhängig zu sein), aber in den meisten Fällen scheint dies keine Probleme zu verursachen.

    
mosaik 13.01.2012, 10:28
quelle
6

Callin Py_Initialize() zweimal funktioniert nicht gut, aber Py_NewInterpreter funktioniert , je nachdem, was du versuchst. Lesen Sie die Dokumente sorgfältig, Sie müssen die GIL halten, wenn Sie dies aufrufen.

    
NicDumZ 26.09.2009 10:01
quelle
4

Sie können das, aber ich würde Ihnen empfehlen, einen Python-Interpreter nicht erneut zu implementieren, wenn es eine Standardimplementierung gibt. Verwenden Sie boost :: python , um mit Python zu interagieren.

    
pyon 26.09.2009 06:28
quelle
1

Ich glaube nicht, dass Sie die erste Person sind, die das machen möchte, leider glaube ich, dass das nicht möglich ist. Können Sie die Python-Interpreter als separate Prozesse ausführen und RPC verwenden?

    
John La Rooy 04.10.2009 01:00
quelle
1

mosaiks Antwort funktionierte nicht in meiner Situation, in der mein Modul ein Plugin für eine Host-Anwendung ist, die Python bereits initialisiert. Ich konnte es mit dem folgenden Code arbeiten.

%Vor%

Als ich PyEval_AcquireLock() anrief, blockierte das Programm und die Funktion kehrte nicht zurück. Außerdem schien der Aufruf von PyEval_ReleaseThread(myState) den Interpreter ebenfalls ungültig zu machen.

    
Jason 18.03.2015 21:24
quelle
0
  • Sie können den Python-Interpreter außerhalb Ihres Anwendungsspeichers leben lassen. Einfach den Interpreter in eine DLL einbetten.
  • Sie können & amp; Speichern Sie Python-Kontexte, um zwei verschiedene Interpreter zu simulieren.
NewbiZ 05.10.2009 08:45
quelle