在Python里面调用Golang代码的方法

免费教程   2024年01月21日 2:46  

这篇文章主要介绍了在Python里面调用Golang代码的方法,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。

1.调用编译后的动态库文件,报头文件错误

原因:

不同平台下编译的add.so 不能通用,Windows下可以运行的so文件,linux下就不能运行,需要重新编译linux的so文件;

该报错可能就是跨平台使用动态库文件了,需要重新编译。

2.编译的动态库文件在调用时找不到函数方法

原因:

//add.gopackagemainimport"C"//exportAddfuncAdd(a,bint)int{returna+b}//exportAddstrfuncAddstr(a,b*C.char)*C.char{merge:=C.GoString(a)+C.GoString(b)returnC.CString(merge)}//gobuild-buildmode=c-shared-oadd.soadd.gofuncmain(){}

如上:在外部调用的两个函数前的注释://export Add 和 //export Addstr 不可少,而且注释符‘//’和‘export’之间不能有空格。在编译成.so文件的时候,编译器会寻找这个注释。为了能正常编译,我们也必须导入C这个包。

特別注意 //和export 中间不能有空格;该注释不可忽略

3.python和golang之间的参数传递,需要使用C的数据类型进行中间变化

只有int可以不需要转换,直接在go和C直接互相调用

对于不同的类型,需要使用cgo中定义的方法转换,具体可以参考golang-cgo文档。

比如string需要用C.char来传递,C.GoString(s)可以将C.char类型转换为string,反之C.CString可以把string类型转为 *C.char

Python是利用ctypes来跟so模块进行交互,其中存在着一个代码的翻译过程,包括数据类型的翻译,如果需要传参获取接收返回值,需要在golang中将参数按照下表对应,定义成C语言的数据类型。

,ctypes , c 对应类型参考

python 官方文档

4.python在入参字符串时还需要使用utf-8进行编码,装换为byte类型

#-*-coding:utf-8-*-importctypeslib=ctypes.cdll.LoadLibrary('./add.so')result=lib.Add(2020,1)print(result)add=lib.Addstr#调用go模块#显式声明参数和返回的期望类型add.argtypes=[ctypes.c_char_p,ctypes.c_char_p]add.restype=ctypes.c_char_pstr1=add("abc".encode("utf-8"),'efg'.encode("utf-8"))print(str1,type(str1))

再次说明:

go中的*C.char 对应 ctypes 中的c_char_p 对应Python中的bytes object or None

Python与Go之间的参数传递, 处理非INT型时需要都转为对应的C类型

ctypes需要显式地声明DLL函数的参数和返回期望的数据类型

注意在Python3中字符串bytes和string的区别

Go模块需要//export 声明外部可调用

Go处理C的类型是需要显式转换

编译:

go build -buildmode=c-shared -o add.so add.go

// 这条命令指定了编译模式为c-shared,编译完成以后,当前文件夹下面会生成一个add.so文件。这就是我们需要用 Python 载入的文件了。

以上就是在Python里面调用Golang代码的方法的详细内容了,看完之后是否有所收获呢?如果想了解更多相关内容,欢迎来行业资讯!

域名注册
购买VPS主机

您或许对下面这些文章有兴趣:                    本月吐槽辛苦排行榜

看贴要回贴有N种理由!看帖不回贴的后果你懂得的!


评论内容 (*必填):
(Ctrl + Enter提交)   

部落快速搜索栏

各类专题梳理

网站导航栏

X
返回顶部