Boost-python Как передать экземпляр класса C ++ в питон class

Я новичок в ускорении Python. Мне нужно сначала инициализировать экземпляр класса cpp в коде cpp, а затем передать этот экземпляр cpp коду python, использовать экземпляр класса python для его вызова (экземпляр cpp). Я пробовал использовать API Python / C, но не смог, поэтому мне интересно, как передать экземпляр класса 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-> для Python. Но я просто не знаю, как это сделать. Заранее благодарим вас за терпение !!

11
задан Wenbo 20 February 2011 в 05:35
поделиться