自学内容网 自学内容网

Python调用go语言编译的库

要在 Python 中调用用 Go 语言编写的库,可以使用 Go 语言的 cgo 特性将 Go 代码编译成共享库(如 .so 文件),然后在 Python 中通过 ctypes 或 cffi 模块加载和调用这个共享库。

新建main.go文件,使用go语言编写如下代码并编译为.so库

package main

import "C"

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

func main() {}

编译指令:

cd 到该文件所在目录

go build -o mylib.so -buildmode=c-shared main.go

mylib.so可以自己随意定义名字,后缀名使用.so即可

执行编译指令后,将生成两个文件:mylib.so(共享库)和 mylib.h(头文件)

Note: 想要编译成功,这里有两个注意事项:

  • 要导入 “C” 库,C库不导入也无法生成mylib.h文件,最终的.so也无法使用

在 Go 语言中,使用 cgo 特性来编写可以与 C 语言互操作的代码时,需要导入 "C" 包。导入 "C" 包的主要原因是为了使用 cgo 提供的功能,包括:

  1. 导出 Go 函数:通过 export 注释将 Go 函数导出为 C 函数,使其可以在共享库中被调用。
  2. 调用 C 代码:在 Go 代码中嵌入 C 代码,或者调用 C 函数和使用 C 数据类型。

导入 "C" 包是为了启用 cgo 特性,使得可以在 Go 代码中嵌入 C 代码、调用 C 函数、使用 C 数据类型,以及将 Go 函数导出为 C 函数。通过这种方式,可以编写可以与 C 语言互操作的 Go 代码,并将其编译为共享库,以便在其他语言(如 Python)中调用。

  •  要有export语句-->注意使用该语句时 //后面不能有空格,所则导出后没有mylib.h文件,mylib.so文件也不能使用

//export Add

export 注释将其导出为共享库中的函数。


  • 最终在Python中使用的文件是mylib.so 文件,mylib.h不需要,编写如下Python代码,调用我们上面编译好的共享库
import ctypes


if __name__ == '__main__':
    mylib = ctypes.CDLL("./mylib.so")

    # 定义函数原型
    mylib.Add.argtypes = (ctypes.c_int, ctypes.c_int)
    mylib.Add.restype = ctypes.c_int

    # 调用函数
    result = mylib.Add(5, 55)
    print(f"Result of Add(5, 55): {result}")
  • 输出结果:


原文地址:https://blog.csdn.net/weixin_43054437/article/details/145155488

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!