【发布时间】:2021-05-23 01:35:59
【问题描述】:
我构建了一个 cgo 库并使用 python(带有 ctypes 包)来调用它。代码被编译成 32 位和 64 位版本,这些库分别被 32 位和 64 位 python 程序调用。我发现显然参数没有正确传递。我认为这可能与数组的定义和在 python 程序和库之间传递的方式有关。
例如,go库“callnames.so”中的一个函数定义为
func Initialize(namelist []*C.char, grp *C.char)
调用这个函数的python代码部分是 GoSliceChar 类(结构): 字段 = [("data", POINTER(c_char_p)), ("len", c_longlong), ("cap", c_longlong)]
numNames = 3
n1 = c_char_p(b"peter")
n2 = c_char_p(b"tom")
n3 = c_char_p(b"nancy")
group = c_char_p(b"group1")
names = GoSliceChar((c_char_p * numComponents)(n1, n2, n3), numNames, numNames )
lib = cdll.LoadLibrary("./callnames.so")
lib.Initialize(names, group)
这些代码在 64 位环境下运行良好,即 python-64 + 64 位 cgo 库。但是,当我切换到 32 位时出现了问题。通过将 Python 中 GoSliceChar 的定义更改为
,我进行了快速而肮脏的修复 class GoSliceChar(Structure):
_fields_ = [("data", POINTER(c_char_p)), ("len", c_long), ("cap", c_long)]
但我真的不明白为什么解决了这个问题,以及它是否是一个可靠的解决方案。请帮忙。谢谢。
【问题讨论】:
-
我使用的 Anaconda 只允许 32 位或 64 位版本的 Python。你能用 ldd(Linux)或depend.exe(Windows)找出库的依赖关系吗?
标签: python go 32bit-64bit cgo