2009-07-18 7 views
5

Ich möchte eine Instanz einer Python-Klasse erstellen, die im Bereich __main__ mit der C-API definiert ist.Erstelle Instanz einer Python-Klasse, deklariert in Python, mit C API

Zum Beispiel wird die Klasse MyClass genannt und ist wie folgt definiert:

class MyClass: 
    def __init__(self): 
     pass 

Der Klassentyp lebt unter __main__ Umfang.

Innerhalb der C-Anwendung möchte ich eine Instanz dieser Klasse erstellen. Dies könnte einfach mit PyInstance_New als Klassenname möglich gewesen sein. Diese Funktion ist jedoch in Python3 nicht verfügbar.

Jede Hilfe oder Vorschläge für Alternativen sind willkommen.

Danke, Paul

Antwort

16

Ich glaube, der einfachste Ansatz ist:

/* get sys.modules dict */ 
PyObject* sys_mod_dict = PyImport_GetModuleDict(); 
/* get the __main__ module object */ 
PyObject* main_mod = PyMapping_GetItemString(sys_mod_dict, "__main__"); 
/* call the class inside the __main__ module */ 
PyObject* instance = PyObject_CallMethod(main_mod, "MyClass", ""); 

zuzüglich der Prüfung natürlich Fehler. Sie brauchen nur DECREF instance, wenn Sie damit fertig sind, die anderen beiden sind geliehenen Referenzen.