【问题标题】:Boost-python How to pass a c++ class instance to a python classBoost-python 如何将 c++ 类实例传递给 python 类
【发布时间】:2011-06-30 15:19:27
【问题描述】:

我是提升 python 的新手。我必须首先在 cpp 代码中初始化一个 cpp 类实例,然后将此 cpp 实例传递给 python 代码,使用 python 类实例来调用它(cpp 实例)。我尝试过 Python/C API 方式,但失败了,所以我想知道如何将 c++ 类实例传递给 python 类。

以下是我的代码,改自 boost python 演示。

在 main.cpp 中

#include <python2.6/Python.h>
#include <boost/python.hpp>
#include <iostream>

using namespace boost::python;
using namespace std;

class World
{
private:
    string name;
public:
    void set(string name)
    {
        this->name = name;
    }
    void greet()
    {
        cout << "hello, I am " << name << endl;
    }
};

typedef boost::shared_ptr< World > world_ptr;

BOOST_PYTHON_MODULE(hello)
{
    class_<World>("World")
    .def("greet", &World::greet)
    .def("set", &World::set)
    ;

    register_ptr_to_python<world_ptr>();
};

int main()
{
    Py_Initialize();
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");

    world_ptr worldObjectPtr (new World);
    worldObjectPtr->set("C++!");

    try
    {
        inithello();
        PyObject* pModule =PyImport_ImportModule("python");
        PyObject* pDict = PyModule_GetDict(pModule);
        PyObject* pClassHelloPython = PyDict_GetItemString(pDict, "Person");
        PyObject* pInstanceHelloPython = PyInstance_New(pClassHelloPython, NULL, NULL);

        PyObject_CallMethod(pInstanceHelloPython, "sayHi", NULL);
        worldObjectPtr->greet();
        PyObject_CallMethod(pInstanceHelloPython, "greetReset", "O", worldObjectPtr);
        worldObjectPtr->greet();
    }
    catch (error_already_set)
    {
        PyErr_Print();
    }

    Py_Finalize();

    return 0;
}

在 python.py 中

class Person:
    def sayHi(self):
        print 'hello from python'

    def greetReset(self, instance):
        instance.set('Python')

在上面的代码中,我想将 worldObjectPtr 传递给 pInstanceHelloPython,因此,pInstanceHelloPython 可以将 worldObjectPtr->name 设置为 Python。但我只是不知道该怎么做。提前感谢您的耐心等待!

【问题讨论】:

    标签: c++ python boost-python


    【解决方案1】:

    通过 boost::python::ptr 将对象指针传递给 python。这将阻止 python 解释器进行复制:

    #include <boost/python.hpp>
    #include <string>
    #include <iostream>
    
    using namespace boost::python;
    using namespace std;
    
    class World
    {
    private:
        string name;
    public:
        void set(string name) {
            this->name = name;
        }
        void greet() {
            cout << "hello, I am " << name << endl;
        }
    };
    
    typedef boost::shared_ptr< World > world_ptr;
    
    BOOST_PYTHON_MODULE(hello)
    {
        class_<World>("World")
            .def("greet", &World::greet)
            .def("set", &World::set)
        ;
    };
    
    int main(int argc, char **argv)
    {
        Py_Initialize();
        try {
            PyRun_SimpleString(
                "class Person:\n"
                "    def sayHi(self):\n"
                "        print 'hello from python'\n"
                "    def greetReset(self, instance):\n"
                "        instance.set('Python')\n"
              );
    
            world_ptr worldObjectPtr (new World);
            worldObjectPtr->set("C++!");
    
            inithello();
            object o_main 
                = object(handle<>(borrowed(PyImport_AddModule("__main__"))));
            object o_person_type = o_main.attr("Person");
            object o_person = o_person_type();
            object o_func1 = o_person.attr("sayHi");
            o_func1();
            object o_func2 = o_person.attr("greetReset");
            o_func2(boost::python::ptr(worldObjectPtr.get()));
            worldObjectPtr->greet();
        }
        catch (error_already_set) {
            PyErr_Print();
        }
    
        Py_Finalize();
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 2022-10-24
      • 1970-01-01
      相关资源
      最近更新 更多