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)
我在我的项目中使用 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)