gpt4 book ai didi

python - 从C++访问在python中创建的C++类

转载 作者:行者123 更新时间:2023-12-01 14:54:37 30 4
gpt4 key购买 nike

这该怎么做

c++ -> Python -> c++
^ |
| |
-----------------
  • C++应用程序托管python。
  • Python创建一个类,该类实际上是对c / c++对象
  • 的包装
  • 如何从托管c++访问由python创建的此对象的c / c++指针?

  • 代码示例:

    想象一下,我有一个为python包装的C++类(例如,使用boost.python)
    // foo.cpp
    #include <boost/python.hpp>

    struct Cat {
    Cat (int fur=4): _fur{i} { }
    int get_fur() const { return _fur; }
    private:
    int _fur;
    };

    BOOST_PYTHON_MODULE(foo) {
    using namespace boost::python;

    class_<Cat>("Cat", init<int>())
    .def("get_fur", &A::get_fur, "Density of cat's fur");

    }

    现在 我在C++ 中托管一个python。一个python脚本创建 Cat =>在下面创建一个c++ Cat实例。如何从托管c++(从C++到C++)获取指向Cat的c++实例的指针?
    #include <Python.h>

    int
    main(int argc, char *argv[])
    {
    Py_SetProgramName(argv[0]); /* optional but recommended */
    Py_Initialize();
    PyRun_SimpleString("from cat import Cat \n"
    "cat = Cat(10) \n");

    // WHAT to do here to get pointer to C++ instance of Cat
    ... ??? ...

    std::cout << "Cat's fur: " << cat->get_fur() << std::endl

    Py_Finalize();
    return 0;
    }

    实际应用程序
    真正的问题是:我们有一个c++框架,该框架具有相当复杂的初始化和配置阶段,而性能并不关键;然后是处理阶段,性能就是一切。该框架有一个python包装。在python中定义内容非常方便,但从python运行仍然比纯c++代码慢。出于多种原因,在python中进行此配置/初始化阶段,获取指向C++对象下面的指针,然后在“纯c++模式”下运行的诱因是很诱人的。如果我们可以从头开始编写所有内容,那将很容易,但是我们已经定义了很多(已有30年的历史了)c++框架。

    最佳答案

    #include <Python.h>

    int main(int argc, char *argv[])
    {
    Py_SetProgramName(argv[0]);
    Py_Initialize();

    object module = import("__main__");
    object space = module.attr("__dict__");

    exec("from cat import Cat \n"
    "cat = Cat(10) \n",
    space);

    Cat& cat = extract<Cat&>(space["cat"]);
    std::cout<<"Cat's fur: "<< cat.get_fur() <<"\n";

    //or:

    Cat& cat2 = extract<Cat&>(space.attr("cat"));
    std::cout<<"Cat's fur: "<< cat2.get_fur() <<"\n";

    //or:

    object result = eval("cat = Cat(10)");
    Cat& cat3 = extract<Cat&>(result);
    std::cout<<"Cat's fur: "<< cat3.get_fur() <<"\n";

    Py_Finalize();
    return 0;
    }

    关于python - 从C++访问在python中创建的C++类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58770519/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com