error: use of undeclared identifier 'LP_c_uint'

error: use of undeclared identifier 'LP_c_uint'

我在我的项目中使用 cppyy 来调用 C API。

当发生异常时,pytest 中的 capfd 插件捕获的错误日志如下:

input_line_33:2:11: error: use of undeclared identifier 'LP_c_uint'
 (sizeof (LP_c_uint))

它来自下面的代码块,特别是 logger.error() 调用:

try:
....
except Exception as e:
    out, err = capfd.readouterr()
    if err:
        logger.error(err)

现在,如果我 grep 我的 python 源代码,我不会找到 'LP_c_uint'。 有关如何调试此问题的任何指示(例如可能导致此问题的原因)?

编辑:

简单的复制器:

from ctypes import c_uint32, pointer, byref
import cppyy

from cppyy import sizeof
cppyy.cppdef(
    """
    void func(uint32_t *param) {
        std::cout << "param: " << *param << std::endl;
    }
    """
)

if __name__ == "__main__":
    param = pointer(c_uint32(17))
    cppyy.gbl.func(param)
    print(sizeof(param))

输出:

param: 17
input_line_22:2:11: error: use of undeclared identifier 'LP_c_uint'
 (sizeof (LP_c_uint))
          ^
0

是的,使用 ctypes.sizeof 即可解决。我看到这里需要使用 ctypes.c_uint32(尽管没有必要使用 ctypes.pointer),因为无法从 cppyy.gbl.uint32_t(基本上是 Python' s int,因此不会暴露指向指针的内部结构。

cppyy.sizeof 现在更改为根据需要转发到 ctypes.sizeof。这将使您的代码工作并将成为下一个版本的一部分。作为当前的解决方法,您可以执行类似的操作。例如:

def my_sizeof(tt):
    try:
        return ctypes.sizeof(tt)
    except TypeError:
        pass
    return cppyy.sizeof(tt)