例如,我使用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”。
答案 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 ++方面“手动”进行更改,并在更改曝光组成时对其进行维护。这样,您只需要知道诸如列表或列表之类的名称,并首先将其导入即可获得这种功能。