IT虾米网

Python C api 迭代模块中的类

kuangbin 2025年05月04日 程序员 116 0

在本例中,模块是从文件加载的 python 脚本。我在互联网上找不到任何与此相关的信息。

如果我可以循环遍历模块中的所有对象,我可以使用 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(显然不能以这种方式进行迭代。)

请您参考如下方法:

解决了。希望这对其他人有帮助。

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; 
    } 
} 


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!