当前位置: 首页 > 面试题库 >

Boost-python如何将C ++类实例传递给python类

吴鸿彩
2023-03-14
问题内容

我是新来提升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。但是我只是不知道该怎么做。谢谢您的耐心配合!!


问题答案:

通过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;
}


 类似资料:
  • 问题内容: 我正在使用redis-py,并希望将- inf和inf与ZRANGEBYSCORE一起使用。我试图使用inf的字符串和浮点数来执行此操作,但是它们返回一个空集。我怎样才能做到这一点? 编辑 我尝试执行以下命令: 要么 更新 我的错误是我对zrangebyscore的抽象错误地使用了zrange … inf的工作原理如下。 问题答案: 这是我的代码已经过测试:

  • 问题内容: 以下作品: 垃圾邮件 但是,如果拿来争论呢? TypeError:spam()恰好接受1个参数(给定0) 鉴于我无权访问函数本身,而只能访问代码对象,执行该函数时如何将参数传递给该代码对象?评估可能吗? 编辑:由于大多数读者倾向于不相信这样做的用处,请参见以下用例: 我想将小的Python函数保存到文件中,以便可以从其他计算机上调用它们。(在这里不必说这个用例会严重限制可能的功能。)腌

  • 问题内容: 这是Proxy类的方法签名: 我检查了Proxy类中newProxyInstance的源代码,找不到代理对象将自身传递给InvocationHandler方法的位置 有人知道吗? 谢谢 问题答案: 您可以通过通常的方式提供参考。一种常见的模式是创建一个最终变量来引用目标,并将匿名实现传递给该方法,如下所示: 这个示例是世界上最没有意义的代理,因为它无需任何操作即可修补所有方法调用,但是

  • 问题内容: 我想知道如何在Quartz中从外部传递实例变量? 下面是我想写的伪代码。如何将externalInstance传递给此Job? 问题答案: 您可以将您的实例放在schedulerContext中。要计划作业时,可以在执行以下操作之前: 您的工作类别如下: 如果您使用的是Spring,那么您实际上可以使用spring的支持来注入整个applicationContext,就像在Link中回

  • 我正在尝试用Dapper和存储过程编写一些更通用的代码。我做了一些研究,但我被这部分卡住了… 我有一些类似实体的类,这些实体将被一些存储过程返回(那些过程不能被修改)。例如,我有两个类。 存储过程通常返回一些select子句,对于本例,它返回两个select子句,每个子句用于用户和角色的信息,因此我有以下类来存储这些子句。 在这个项目中,我们必须使用Dapper,所以我做了一个泛型函数,其中T是将

  • 我正在开发一个N-皇后模拟使用pyplay。 另外,我在另一个文件中有一个pygame程序,用于绘制棋盘,该棋盘将列表作为输入,并相应地放置它们。如果我想显示皇后的移动,如何从递归过程动态传递列表,以便可以看到确切的回溯过程。非常感谢。