前言

最近在学习使用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}未完待续 未完待续