Как управлять объектом класса C ++ в Python? - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу управлять объектом класса c ++ в python.

Я ожидаемый пример.

  1. Возражаем класс в c ++ и отправляем объект в python.

    class Animal animal();
    PyObject *py_func = PyObject_GetAttrString(mymodule, "ControlAnimal");
    PyObject_CallFunction(func, "class Animal", animal);
    
  2. Объект управления в python.

    def ControlAnimal(animal) // Get animal object is created object from c++.
        pass
    
  3. если объект управляется в python, то животное в c ++ также применяется, потому что animal это ссылка на объект c ++ в python.

Я уже попробовал SWIG и успешно связал класс Animal с python.

python.
>> import animal
>> a = animal.Animal()

Но он только управляет созданным объектом класса в python.

Извините, плохой английский.

1 Ответ

0 голосов
/ 08 ноября 2018

Я решил эту проблему с помощью статической глобальной переменной.

объявить статическую глобальную переменную совместно используемую переменную python в заголовочном файле.

static Animal* g_animal;

Написать функцию для установки и получения g_animal.

Animal* SetCppInstance(PyObject* capsule);
Animal* GetCppInstance();

Вы можете установить указатель созданного животного объекта в c ++ для использования в python. Чтобы установить g_aniaml в python, используйте PyObject_CallFunction ().

Animal aniaml;
PyObject *py_module_animal = PyImport_ImportModule("animal");
PyObject *py_module_animal_setcppinstance = PyObject_GetAttrString(py_module_animal, "SetCppInstance");
PyObject_CallFunction(py_module_animal_setcppinstance, "O", py_capsule_animal);

И вы должны получить свой модуль Python. Чтобы получить модуль Python Animal, я использую Swig.

Затем вы должны написать control.py для управления животным.

import animal
obj = animal.GetCppInstance()
...

Конечно, вы должны вызывать control.py вручную в c ++.

PyImport_ImportModule("control");

Теперь, если вы управляете obj в control.py, то и животное в c ++ также изменится.

...