小编典典

将C ++类实例暴露给python嵌入式解释器

python

我正在寻找一种将C ++类实例公开给python嵌入式解释器的简单方法。

  • 我有一个C ++库。这个库被包装了(目前使用swig),我可以从python解释器中使用它
  • 我有一个C ++主程序,可以实例化我库中的Foo类并嵌入python解释器

我想将Foo的C ++世界实例公开给python世界(并视为Foo类)。

如果可能,这可能吗?

我认为这几乎与第一个答案一样: boost :: python ::
ptr或PyInstance_New用法

我想这意味着我应该使用boost.Python包装我的图书馆?

我唯一的目标是在嵌入式python解释器中操作Foo的C ++实例(不确定是否可以使用先前的方法来完成)。

希望我很清楚,谢谢您的帮助。

更新

感谢您的回答。实际上,我已经将我的Foo类暴露给了python(带有swig)。

是)我有的:

我的Foo班:

class Foo{...};

我的包装库(包括Foo类)暴露给了python: 因此我可以启动python解释器并执行以下操作:

import my_module
foo=my_modulde.Foo()

我想要的是:

具有一个C 主程序,该程序嵌入了python解释器并处理C 世界变量。

int main(int argc, char **argv)
{
    Foo  foo;   // instanciates foo

    Py_Initialize();

    Py_Main(argc, argv); // starts the python interpreter
                         // and manipulates THE foo instance in it

    Py_Finalize();

    return 0;
}

现在更清晰?:)


阅读 238

收藏
2021-01-20

共1个答案

小编典典

Boost
python
允许您以非常紧密的集成方式将c
类公开给python-您甚至可以包装它们,以便可以从c 类派生python类,并将虚拟方法解析为python覆盖。

升压蟒蛇教程是一个良好的开端。


编辑:

You can create a c++ object and pass a reference to it to an internal python
interpreter like this:

#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
#include <boost/python.hpp>
#include <string>
#include <iostream>

namespace bp = boost::python;

struct Foo{
    Foo(){}
    Foo(std::string const& s) : m_string(s){}
    void doSomething() {
        std::cout << "Foo:" << m_string << std::endl;
    }
    std::string m_string;
};

typedef boost::shared_ptr<Foo> foo_ptr;

BOOST_PYTHON_MODULE(hello)
{
    bp::class_<Foo, foo_ptr>("Foo")
        .def("doSomething", &Foo::doSomething)
    ;
};

int main(int argc, char **argv)
{
    Py_Initialize();
    try {
        PyRun_SimpleString(
            "a_foo = None\n"
            "\n"
            "def setup(a_foo_from_cxx):\n"
            "    print 'setup called with', a_foo_from_cxx\n"
            "    global a_foo\n"
            "    a_foo = a_foo_from_cxx\n"
            "\n"
            "def run():\n"
            "    a_foo.doSomething()\n"
            "\n"
            "print 'main module loaded'\n"
        );

        foo_ptr a_cxx_foo = boost::make_shared<Foo>("c++");

        inithello();
        bp::object main = bp::object(bp::handle<>(bp::borrowed(
            PyImport_AddModule("__main__")
        )));

        // pass the reference to a_cxx_foo into python:
        bp::object setup_func = main.attr("setup");
        setup_func(a_cxx_foo);

        // now run the python 'main' function
        bp::object run_func = main.attr("run");
        run_func();
    }
    catch (bp::error_already_set) {
        PyErr_Print();
    }

    Py_Finalize();

    return 0;
}
2021-01-20