Python C api遍历模块中的类
Posted
技术标签:
【中文标题】Python C api遍历模块中的类【英文标题】:Python C api iterate through classes in module 【发布时间】:2014-08-14 18:10:26 【问题描述】:在这种情况下,模块是从文件加载的 python 脚本。我在 Internet 上找不到任何关于此的内容。
如果我可以遍历模块中的所有对象,我可以使用 PyClass_Check 过滤类。但我也不知道该怎么做。
// Load
Py_SetProgramName(argv[0]);
Py_Initialize();
PySys_SetArgv(argc, argv);
inithello();
PyObject *pModule = PyImport_ImportModule("test123");
if (pModule != NULL)
// iterate through classes.
Py_DECREF(pModule);
else
PyErr_Print();
std::cerr << "Failed to load module" << std::endl;
return 1;
Py_Finalize();
这样做的原因是用户将使用从基类派生的类来定义游戏内容。
class grass_tile(game.Tile):
def __init__(x, y):
// initialise
我曾尝试在模块上使用 PyObject_GetIter(),但它返回 NULL(显然不能以这种方式迭代。)
【问题讨论】:
【参考方案1】:解决了。希望这对其他人有帮助。
PyObject *dict = PyModule_GetDict(pModule);
PyObject *key, *value = NULL;
Py_ssize_t pos = 0;
while (PyDict_Next(dict, &pos, &key, &value))
if (PyClass_Check(value))
std::cerr << "IsClass" << std::endl;
else
std::cerr << "NotClass" << std::endl;
【讨论】:
以上是关于Python C api遍历模块中的类的主要内容,如果未能解决你的问题,请参考以下文章