Python调用Go库传递字符串与整数参数的问题排查
问题解决:Go库与Python ctypes交互的参数问题
初始类型错误原因
初始代码中,Go函数第三个参数是string类型,但Python的argtypes将其声明为ctypes.c_int,同时传参时直接传入字符串"JAN",类型不匹配导致ctypes.ArgumentError。
更新后仅获取首字符的问题解决
问题根源
- Python未指定
argtypes时,默认将字符串转为宽字符指针(c_wchar_p),而Go函数接收的是C风格字节串指针(*C.char)。宽字符每个字符占2字节,第二个字节为0,C.GoString遇到第一个0就会截断,因此只能拿到首字符。 - Python传参时直接传入字符串而非字节串,与Go的
*C.char类型不匹配。
修复方案
1. 修正Python代码
- 明确指定
argtypes为[ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p],确保参数类型匹配。 - 所有字符串参数转为字节串(用
b"xxx"或.encode('utf-8'))。 - 将
restype设为ctypes.c_char_p,对应Go返回的*C.char。
修正后的Python代码:
import ctypes library = ctypes.cdll.LoadLibrary('./lib.so') get_data = library.getData # 明确指定参数和返回值类型 get_data.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p] get_data.restype = ctypes.c_char_p # 所有字符串参数转为字节串 j = get_data(b"BTC", b"3", b"JAN", b"23") print(j.decode('utf-8'))
2. Go代码确认(无需修改,确保导出正确)
确保Go代码正确导出,且使用C.GoString正确转换:
//export getData func getData(symbol, day, month, year *C.char) *C.char { x := C.GoString(symbol) + "-" + C.GoString(day) + "-" + C.GoString(month) + "-" + C.GoString(year) log.Println(x) // 处理后返回C风格字符串,注意使用C.CString并在合适时机释放内存(长期运行需避免内存泄漏) return C.CString(x) }
额外注意事项
Go中使用C.CString创建的C风格字符串,需要手动调用C.free释放内存,避免内存泄漏。短生命周期调用可忽略,长期运行场景建议添加释放逻辑。
内容的提问来源于stack exchange,提问作者Volatil3
相关产品推荐
相关产品推荐

