Создать экземпляр класса Python, объявленный в Python, с C API - PullRequest
6 голосов
/ 18 июля 2009

Я хочу создать экземпляр класса Python, определенного в области действия __main__, с помощью API C.

Например, класс называется MyClass и определяется следующим образом:

class MyClass:
    def __init__(self):
        pass

Тип класса находится в области действия __main__.

В приложении C я хочу создать экземпляр этого класса. Это могло бы быть просто возможно с PyInstance_New, так как он принимает имя класса. Однако эта функция недоступна в Python3.

Любая помощь или предложения по альтернативам приветствуются.

Спасибо, Пол

1 Ответ

17 голосов
/ 18 июля 2009

Я считаю, что самый простой подход:

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

плюс конечно же проверка ошибок. Вам нужно только DECREF instance, когда вы закончите с этим, остальные два - заимствованные ссылки.

...