Python通过C动态链接库调用Go语言函数
Python中自带的ctypes可以加载C标准动态链接库并调用其中方法,Golang则也可以按C标准类型编写并对外暴露函数,这样Python就可以调用由Go语言编写的函数进行操作。例如。
- 创建go项目
mkdir go-calc
cd go-calc
go mod init calc
echo "package main" > "main.go"
- 编写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 函数名
进行导出,外部才能调用,函数名无需首字母大写
- 编译成C动态链接库
在项目根目录下运行
go build -buildmode=c-shared -o calc.so
- 使用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'
注:浮点数相加不准确是计算机计算一个常见问题