python调用golang动态链接库.so和.dll
前言
最近在学习使用python写一些适用的小工具,但是遇到了一些问题,问题场景:需要链接多种数据库(mysql、sqlite3等)并且有很好的移植性质,sqlite倒是比较好解决包也很好装,mysql就比较坑爹了各种安装各种报错(我的开发环境如此那移到其他电脑上岂不是要王炸),遂最终放弃了直接使用python链接数据库这条路线,改用动态链接库(目前linux环境下的.so动态链接库已经实现),下面把我的成果分享出来供搭建参考。
.so链接方法(linux)golang 源码及编译
源码
//main.go
package main
import "C"
//下面这句很重要,对外开放Hello方法 不加这个外部无法访问该方法
//export Hello
func Hello() string {
return "Hello"
}
//下面这句很重要,对外开放Hello方法 不加这个外部无法访问该方法
//export Add
func Add(left, right *C.char) *C.char {
// bytes对应ctypes的c_char_p类型,翻译成C类型就是 char *指针
merge := C.GoString(left) + C.GoString(right)
return C.CString(merge)
}
//export Test
func Test(){
println("test");
}
func main() {
}
编译
go build -x -v -ldflags "-s -w" -buildmode=c-shared -o libhello.so main.go
python
方法1
from ctypes import *
import ctypes
class StructPointe(Structure):
_fields_ = [("p", c_char_p), ("n", c_longlong)]
if __name__ == "__main__":
lib = cdll.LoadLibrary('libhello.so')
lib.Hello.restype = StructPointe
aa = lib.Hello()
aa=aa.p[:aa.n]
方法二
from ctypes import *
import ctypes
if __name__ == "__main__":
add= ctypes.CDLL('libhello.so').Add
# 显式声明参数和返回的期望类型
add.argtypes = [ctypes.c_char_p, ctypes.c_char_p]
add.restype = ctypes.c_char_p
left = b"Hello"
right = b"World"
bb=add(left, right)
.dll链接方法(windows)
由于我的开发环境是Ubuntu遂windows目前还没测试后续会补上
未 完 待 续 \color{red}未完待续 未完待续