Pregunta

Quiero crear una instancia de una clase Python definido en el alcance __main__ con la API C.

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

class MyClass:
    def __init__(self):
        pass

El tipo de clase vive bajo alcance __main__.

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 nombre de la clase. Sin embargo, esta función no está disponible en python3.

Cualquier ayuda o sugerencias de alternativas son apreciados.

Gracias, Paul

¿Fue útil?

Solución

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. Sólo necesita instance DECREF cuando haya terminado con él, los otros dos son referencias prestado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top