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
提供的功能,包括:
- 导出 Go 函数:通过 export 注释将 Go 函数导出为 C 函数,使其可以在共享库中被调用。
- 调用 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)!