如何在python中控制c ++类对象?

时间:2018-11-07 08:33:23

标签: python c++ swig

我想在python中控制c ++类对象。

我是个例子。

  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中控制的,则由于动物是python中c ++对象的引用,因此也适用c ++中的animal。

我已经尝试过SWIG并成功将Animal类绑定到python。

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

但是它只能控制python中创建的类对象。

对不起英语不好。

1 个答案:

答案 0 :(得分:0)

我通过使用静态全局变量解决了这个问题。

在头文件中声明静态全局变量共享的python变量。

static Animal* g_animal;

编写函数以设置并获取g_animal。

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

您可以在c ++中将创建的动物对象指针设置为在python中使用。 要在python中设置g_aniaml,请使用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动物模块,请使用swig。

然后,您应该编写control.py来控制动物。

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

当然,您应该在c ++中手动调用control.py。

PyImport_ImportModule("control");

现在,如果您在control.py中控制obj,则c ++中的动物也会更改。