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

Posted

技术标签:

【中文标题】如何在python中控制c++类对象?【英文标题】:How to control c++ class object in python? 【发布时间】:2018-11-07 08:33:22 【问题描述】:

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

我是预期的例子。

    c++ 中的对象类并将对象发送到 python。

    class Animal animal();
    PyObject *py_func = PyObject_GetAttrString(mymodule, "ControlAnimal");
    PyObject_CallFunction(func, "class Animal", animal);
    

    python中的控制对象。

    def ControlAnimal(animal) // Get animal object is created object from c++.
        pass
    

    如果在python中控制对象,c++中的animal也适用,因为animal是python中c++对象的引用。

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

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

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

抱歉英语不好。

【问题讨论】:

你可能想写一个extension module 感谢回复。但是 c++ 扩展模块只能在 python 中使用。我希望在 c++ 中创建的对象由 python 函数控制。 该扩展是为python提供一个定义的接口来访问一些任意 C++ API。可以在 Python 中无缝使用适当定义的 C++ 类型。如果你想控制已经存在的 C++ 类型(你不能或不想修改),你可以创建包装器对象,为包装的类型提供 python 接口。 【参考方案1】:

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

在头文件中声明静态全局变量共享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++ 中的 animal 也会发生变化。

【讨论】:

我在my github repo更新了这个示例源代码。

以上是关于如何在python中控制c++类对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ctypes 将此 Python 对象移动到 C++ 中?

如何使用 PyObjects 声明 Boost.Python C++ 类

如何在 Cython 中返回新的 C++ 对象?

C++单例模式与单例类模板

c++如何读取word

检查一个对象的类是不是派生自C++中另一个对象的类