在我的django应用程序(Django 1.6.0,Python 2.7.5运行在Red Hat上)中,我的数据库驱动程序看到ctypes的错误:
TypeError:不兼容的类型,LP_c_int示例而不是LP_c_int示例
代码如下所示:
is_null = value is None
param.value.is_null = pointer(c_int(is_null)) <-- error occurs on this line
我对ctypes不是很熟悉(我继承了这段代码),但从表面上看,这个错误消息没有任何意义。代码已经运行了很多年,但我现在到处都看到这个错误。我做错什么了吗?
这里是一个最小的repro感谢来自Ilja Everilä的评论:
from ctypes import *
from ctypes import _reset_cache
class DataValue(Structure):
"""Must match a_sqlany_data_value."""
_fields_ = [("buffer", POINTER(c_char)),
("buffer_size", c_size_t),
("length", POINTER(c_size_t)),
("type", c_int),
("is_null", POINTER(c_int))]
d = DataValue()
_reset_cache()
is_null = False
d.is_null = pointer( c_int( is_null ) )
1条答案
按热度按时间b1payxdu1#
我遇到了一个类似的问题,在我的例子中,它与预定义空
Structure
s有关,以避免循环引用。我在做这样的事情:其给出结果:
TypeError:不兼容的类型,LP_B示例而不是LP_B示例
多么无用的信息…🤬
这些注解提示我ctypes缓存的存在,这让我意识到重新定义是问题所在。解决方案是在设置
_fields_
之前简单地预定义所有类:然而,关于你对原生
c_int
的确切问题,我相信这可能与Django的开发服务器重新加载任何更改的模块的能力有关。我从来没有使用过django,但是,这将是我很难测试(特别是考虑到年龄的职位)。ctypes
在导入时自动调用_reset_cache()
。通常对import ...
的重复调用只是获取库的缓存版本,因此我假设它必须与某种类似importlib.reload(...)
的调用相关。