Boost.Python列出所有公开的类和属性

时间:2018-09-03 13:06:09

标签: python c++ boost

例如,我使用Boost.Python将类从C ++公开给Python:

from opcua import Client
client = Client("url")
client.connect()
temperature = client.get_node("ns=3;s=\"status\".\"Temperature\"").get_value()

我还将一些变量作为主模块的属性公开:

class_<Point>("Point").
        def(init<double, double, double>()).
        add_property("X", &Point::GetX, &Point::SetX).
        add_property("Y", &Point::GetY, &Point::SetY).
        add_property("Z", &Point::GetZ, &Point::SetZ).
        def("SetXYZ", &Point::SetPnt);

是否可以列出所有公开的类和/或模块的所有属性(在C ++中)?

我希望获得所有公开类的列表(MainModule.attr("Window") = object(ptr(mainWindow)); ):在这种情况下,仅是“ Point”。暴露变量也是如此,在本例中为“ Window”。

2 个答案:

答案 0 :(得分:0)

使用Python反射功能:

从C ++中执行一些代码:

PyRun_SimpleString("import inspect");
PyRun_SimpleString("import MyModule");
string getClassesCode =
    "def GetClasses():\n"
    "    for name, obj in inspect.getmembers(MyModule):\n"
    "        if inspect.isclass(obj):\n"
    "            yield obj.__name__\n"
    "_classes = list(GetClasses())\n";


    typedef boost::python::list pylist;
    object main_namespace = MainModule.attr("__dict__");

    try
    {
        exec(getClassesCode.c_str(), main_namespace);
    }
    catch (error_already_set  const &)
    {
        PyErr_Print();
    }

    pylist _classes = extract<pylist>(main_namespace["_classes"]);

    for (int i = 0; i < len(_classes); ++i)
    {
        string className = extract<string>(_classes[i]);
        //do whatever you need with the class name
    }

答案 1 :(得分:-1)

  

是否可以列出所有公开的类和/或所有属性   模块(在C ++中)?我希望得到所有公开类的列表(vector<string>)...

我不知道Boost.Python的这种功能,但是有一个替代选择,尽管有些负担,但可能会暴露准备的列表(您可以使用std::vector<string>,为什么呢?)在C ++方面“手动”进行更改,并在更改曝光组成时对其进行维护。这样,您只需要知道诸如列表或列表之类的名称,并首先将其导入即可获得这种功能。