【问题标题】:Python C api iterate through classes in modulePython C api遍历模块中的类
【发布时间】: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(显然不能以这种方式迭代。)

【问题讨论】:

    标签: python c++ python-2.7 python-embedding


    【解决方案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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-10
      • 2016-08-17
      • 2012-05-04
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      相关资源
      最近更新 更多