Python 调用Go 动态链接库
1.编写Go 动态链接库
1.1 安装g++ windows 安装mingw64,配置环境变量
1.2 编写代码
package main
import "C"
func main() {
//这里写测试导出函数的代码
//str:=Listmethod(C.CString("345"))
//s:=C.GoString(str)
//fmt.Println(s)
}
//导出函数必须加上下面的注释 export 函数名
//export Listmethod
func Listmethod(s * C.char) * C.char {
str:=C.GoString(s)
str=str+"1234"
return C.CString(str)
}
在导出的函数中输入输出为字符串类型,需要将其转成 *C.char类型才行
Go string -> *C.char 使用 C.CString(string)
*C.char -> Go string 使用 C.GoString(*C.char)
只需要转换输入参数和返回值类型即可,无需修改函数内部中间变量的类型,整数类型可以不用修改
编写完代码后,可以在main函数中进行测试,调试一下看看有没有什么问题,调试完后将测试代码注释掉。
1.3 生成 动态链接库
go build -buildmode=c-shared -o 动态链接库名.dll或者.so go代码文件名称.go
windows系统导出的就是.dll linux 导出就写.so
2.编写Python调用代码
import ctypes
lib = ctypes.cdll.LoadLibrary('./string.dll')# 加载动态链接库
addr = ctypes.cast(lib.Listmethod, ctypes.c_void_p).value # 获取地址
functype = ctypes.CFUNCTYPE(ctypes.c_char_p, ctypes.c_char_p) # 创建CFUNCTYPE对象指定返回值类型,输入参数类型
func = functype(addr) # 传入地址 形成可调用函数
print(func("GGG".encode("U8")).decode("U8")) # 调用函数 当参数是字符串是要编码成 bytes类型