2009-07-18 20 views
5

Quiero crear una instancia de una clase Python definida en el alcance __main__ con la API C.Crear instancia de una clase python, declarada en python, con C API

Por ejemplo, la clase se llama MyClass y se define como sigue:

class MyClass: 
    def __init__(self): 
     pass 

el tipo de clase vive bajo __main__ alcance.

Dentro de la aplicación C, quiero crear una instancia de esta clase. Esto podría haber sido simplemente posible con PyInstance_New ya que toma el nombre de la clase. Sin embargo, esta función no está disponible en Python3.

Se agradece cualquier ayuda o sugerencia de alternativas.

Gracias, Paul

Respuesta

16

creo que el enfoque más simple es:

/* 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", ""); 

además de la comprobación de errores por supuesto. Solo necesita DECREF instance cuando haya terminado, las otras dos son referencias prestadas.

Cuestiones relacionadas