使用boost python,我需要创建嵌套的命名空间。
假设我有以下cpp类结构:
namespace a
{
class A{...}
namespace b
{
class B{...}
}
}显而易见的解决方案不起作用:
BOOST_PYTHON_MODULE( a ) {
boost::python::class_<a::A>("A")
...
;
BOOST_PYTHON_MODULE(b){
boost::python::class_<a::b::B>("B")
...
;
}
}它会导致编译时错误:linkage specification must be at global scope
有没有办法将可以从Python访问的类B声明为a.b.B
发布于 2011-11-18 06:18:22
你想要的是一个boost::python::scope。
Python没有“命名空间”的概念,但是你可以像使用命名空间一样使用一个类:
#include <boost/python/module.hpp>
#include <boost/python/class.hpp>
#include <boost/python/scope.hpp>
using namespace boost::python;
namespace a
{
class A{};
namespace b
{
class B{};
}
}
class DummyA{};
class DummyB{};
BOOST_PYTHON_MODULE(mymodule)
{
// Change the current scope
scope a
= class_<DummyA>("a")
;
// Define a class A in the current scope, a
class_<a::A>("A")
//.def("somemethod", &a::A::method)
;
// Change the scope again, a.b:
scope b
= class_<DummyB>("b")
;
class_<a::b::B>("B")
//.def("somemethod", &a::b::B::method)
;
}然后在python中,您需要:
#!/usr/bin/env python
import mylib
print mylib.a,
print mylib.a.A
print mylib.a.b
print mylib.a.b.B所有的a、a.A、a.b和a.b.B实际上都是类,但是您可以像对待名称空间一样对待a和a.b --而且永远不会实例化它们
发布于 2013-06-19 17:58:07
使用虚拟类的技巧是很好的,但不允许:
import mylib.a
from mylib.a.b import B因此,请改用PyImport_AddModule()。你可以在下面的文章中找到完整的例子:Packages in Python extension modules,由Vadim Macagon编写。
简而言之:
namespace py = boost::python;
std::string nested_name = py::extract<std::string>(py::scope().attr("__name__") + ".nested");
py::object nested_module(py::handle<>(py::borrowed(PyImport_AddModule(nested_name.c_str()))));
py::scope().attr("nested") = nested_module;
py::scope parent = nested_module;
py::class_<a::A>("A")...https://stackoverflow.com/questions/7765596
复制相似问题