• Python调用golang


    有些时候因为效率问题部分代码会 使用Python调用go的编译生成动态链接库
    go 代码示例
    //add.go
    package main

    import "C"

    //export Add
    func Add(a, b int) int {
    return a + b
    }

    //export Addstr
    func Addstr(a, b *C.char) *C.char {
    merge := C.GoString(a) + C.GoString(b)
    return C.CString(merge)
    }

    // go build -buildmode=c-shared -o add.so add.go
    func main() {
    }


    注意 需要注意的是,这里的注释//export Addstr //export Add 不能省略,因为在编译成.so文件的时候,编译器会寻找这个注释。同时,为了能正常编译,我们也必须导入C这个包。
    ## 特別注意 //和export 中间不能有空格

    注意: 只有int可以不需要转换,直接在go和C直接互相调用
    对于不同的类型,需要使用cgo中定义的方法转换,具体可以参考golang-cgo文档。
    比如string需要用C.char来传递,C.GoString(s)可以将C.char类型转换为string,反之C.CString可以把string类型转为 *C.char
    Python是利用ctypes来跟so模块进行交互,其中存在着一个代码的翻译过程,包括数据类型的翻译,如果需要传参获取接收返回值,需要在golang中将参数按照下表对应,定义成C语言的数据类型。
    python,ctypes , c 对应类型参考 python 官方文档:https://docs.python.org/3.5/library/ctypes.html


    把代码保存为fib.go,然后我们使用如下命令进行编译:

    go build -buildmode=c-shared -o add.so add.go
    1
    这条命令指定了编译模式为c-shared,编译完成以后,当前文件夹下面会生成一个add.so文件。这就是我们需要用 Python 载入的文件了。
    注意: 不同平台下编译的add.so 不能通用,Windows下可以运行的so文件,linux下就不能运行,需要重新编译linux的so文件

    python 中调用go模块’
    # -*- coding:utf-8 -*-
    # @Time : 2020/9/29
    # @Author : hllyzms
    import ctypes

    lib = ctypes.cdll.LoadLibrary('./add.so')

    result = lib.Add(2020, 1)
    print(result)

    add = lib.Addstr #调用go模块
    # 显式声明参数和返回的期望类型
    add.argtypes = [ctypes.c_char_p, ctypes.c_char_p]
    add.restype = ctypes.c_char_p
    str1 = add("abc".encode("utf-8"),'efg'.encode("utf-8"))
    print(str1,type(str1))


    结果:

    2021
    b'abcefg' <class 'bytes'>
    1
    2
    注意 Addstr 传入测参数要转换成byte类型
    go中的*C.char 对应 ctypes 中的c_char_p 对应Python中的bytes object or None
    Python与Go之间的参数传递, 处理非INT型时需要都转为对应的C类型
    ctypes需要显式地声明DLL函数的参数和返回期望的数据类型
    注意在Python3中字符串bytes和string的区别
    Go模块需要//export 声明外部可调用
    Go处理C的类型是需要显式转换
    ————————————————
    版权声明:本文为CSDN博主「hllyzms」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_37989267/article/details/108869265

  • 相关阅读:
    准确率,召回率,F值
    残差
    字典学习
    深度学习
    cnn 滤波
    tensorflow
    kaggle 泰坦尼克
    python matplotlib
    数学家西蒙斯:华尔街最赚钱的基金经理
    Oracle学习笔记:删除数据空格(trim、ltrim、rtrim函数)
  • 原文地址:https://www.cnblogs.com/ExMan/p/14609973.html
Copyright © 2020-2023  润新知