python调用go,长字符串返回异常

HideMyMemory · 2021-07-03 18:02:44 · 2190 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-07-03 18:02:44 的主题,其中的信息可能已经有所发展或是发生改变。

把go语言编译成so文件,其中一个函数返回的是长字符串,如:1M左右。 在python代码只能接收到前200多个长度的字符串。 有没有大佬指条明路。


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2190 次点击  
加入收藏 微博
1 回复  |  直到 2021-07-03 18:08:42
HideMyMemory
HideMyMemory · #1 · 4年之前

以下是go语言代码

//export ReadScFile
func ReadScFile(pFilePath *C.char) *C.char {
    sFilePath := C.GoString(pFilePath)
    sFileText := ReadBinaryFile(sFilePath)
    pReturnString := C.CString(*sFileText)
    return pReturnString
}

//打开sc文件
func ReadBinaryFile(sFilePath string) *string {
    pFileHandle, sError := os.Open(sFilePath)
    if sError != nil {
        fmt.Println(sError)
    }
    // 当函数执行到最后时,defer语句会按照逆序执行,返回该函数
    defer pFileHandle.Close()

    // 拼接后的字符串
    var sFileText string
    arBuff := make([]byte, 1024)
    // 字符串总长度
    var iWholeLen int
    // 相当于python的while True
    for {
        // 读取的长度,读取时报错的内容
        iReadLen, err := pFileHandle.Read(arBuff)
        iWholeLen += iReadLen
        sBuff := string(arBuff)

        sFileText += sBuff
        if (err == io.EOF) || (iReadLen < 0) {
            break
        }
    }

    return &sFileText
}

以下是python3代码:

from ctypes import cdll, c_char_p, c_wchar_p

pTransfer = cdll.LoadLibrary(r"D:\go\pkg\transfer_param.so")
pTransfer.Concat.argtypes = [c_char_p, c_char_p]
pTransfer.Concat.restype = c_char_p

s_file_path = r"D:\test_file.log"
c_file_path = s_file_path.encode("utf-8")
# 赋值传参类型
pTransfer.ReadScFile.argtypes = [c_char_p]
# 赋值返回值类型
pTransfer.ReadScFile.restype = c_char_p
# 读取cs文件的内容
s_recive_address = pTransfer.ReadScFile(c_file_path)
# 此处只能输出 250 多个字节
print(f"s_recive_address = {s_recive_address}")
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传