等效于 pybind11 中的 boost::python py::scope().attr()

Posted

技术标签:

【中文标题】等效于 pybind11 中的 boost::python py::scope().attr()【英文标题】:Equivalent to boost::python py::scope().attr() in pybind11 【发布时间】:2020-07-03 19:45:52 【问题描述】:

我正在将一些代码从boost::python 移植到pybind11

我有一个课程classA,我很容易把它包起来:

PYBIND11_MODULE(module, m) 
   m.doc() = "pybind11 module";
   py::class_<classA>(m, "classA")
      .def(...
      ...
   ;

这很完美。我面临的问题是,显然这个类在过去被称为不同的,比如说classB。为了保持向后兼容性(在boost::python 代码中),原始开发人员做了:

py::scope().attr("classB") = py::scope().attr("classA");

pybind11 上是否有与此等价的内容? 谢谢!

【问题讨论】:

还没有使用 pybind111,但据我所知,m 是模块实例。所以也许m.attr("classB") = m.attr("classA") 【参考方案1】:

您可以使用名称:m.attr("C") = m.attr("B");,或变量名称class_A,在这种情况下:

class A

public:
    void hello()
    
        std::cout << "world" << std::endl;
    
;
PYBIND11_MODULE(example, m) 
    py::class_<A> class_A(m, "A");
    class_A.def(py::init<>()).def("hello", &A::hello);

    m.attr("B") = class_A;
    m.attr("C") = m.attr("B");

【讨论】:

以上是关于等效于 pybind11 中的 boost::python py::scope().attr()的主要内容,如果未能解决你的问题,请参考以下文章

并发中的 Pybind11 并行处理问题::parallel_for

pybind11 保持对象活着

拆分 pybind11 模块和自动类型转换的问题

无法从 pybind11 中的静态函数返回 shared_ptr

使用 pybind11 从 C++ 反序列化 Python 中的 protobuf 缓冲区

在 macos 上从 pybind11 文档构建 python_example 时出错