...

Python通过C动态链接库调用Go语言函数

Python中自带的ctypes可以加载C标准动态链接库并调用其中方法,Golang则也可以按C标准类型编写并对外暴露函数,这样Python就可以调用由Go语言编写的函数进行操作。例如。

  1. 创建go项目
mkdir go-calc
cd go-calc
go mod init calc
echo "package main" > "main.go"
  1. 编写go函数
    main.go
package main

import "C"

//export add_int
func add_int(a, b C.int) C.int{
	return a + b
}

//export add_float
func add_float(a, b C.float) C.float{
	return a + b
}


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

func main(){

}

注意,每个函数上必须用//export 函数名进行导出,外部才能调用,函数名无需首字母大写

  1. 编译成C动态链接库
    在项目根目录下运行
go build -buildmode=c-shared -o calc.so
  1. 使用Python调用Go函数
    新建call_go.py
import ctypes


lib = ctypes.CDLL("./calc.so")
print(lib.add_int(3, 5))

lib.add_float.argtypes = [ctypes.c_float, ctypes.c_float]
lib.add_float.restype = ctypes.c_float
print(lib.add_float(3.5, 5.2)) 


lib.add_str.argtypes = [ctypes.c_char_p, ctypes.c_char_p]
lib.add_str.restype = ctypes.c_char_p
print(lib.add_str(b'Hello', b'World'))

运行后输出如下:

8
8.699999809265137
b'HelloWorld'

注:浮点数相加不准确是计算机计算一个常见问题

posted @ 2024-09-16 00:07  韩志超  阅读(13)  评论(0编辑  收藏  举报