Python调用golang代码详解

 更新时间:2024年02月11日 10:37:12   作者:hllyzms  
这篇文章主要给大家介绍了关于Python调用golang代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

有些时候因为效率问题部分代码会 使用Python调用go的编译生成动态链接库

go 代码示例

//add.go
package main

import "C"

//export Add
func Add(a, b int) int {
	return a + b
}

//export Addstr
func Addstr(a, b *C.char) *C.char {
	merge := C.GoString(a) + C.GoString(b)
	return C.CString(merge)
}

// go build -buildmode=c-shared -o add.so add.go
func main() {
}

注意 需要注意的是,这里的注释//export Addstr //export Add 不能省略,因为在编译成.so文件的时候,编译器会寻找这个注释。同时,为了能正常编译,我们也必须导入C这个包。

## 特別注意 //和export 中间不能有空格

注意: 只有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语言的数据类型。
python,ctypes , c 对应类型参考 python 官方文档:https://docs.python.org/3.5/library/ctypes.html

把代码保存为fib.go,然后我们使用如下命令进行编译:

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

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

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

python 中调用go模块’

# -*- coding:utf-8 -*-
# @Time    : 2020/9/29
# @Author  : hllyzms
import ctypes

lib = 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_p
str1 = add("abc".encode("utf-8"),'efg'.encode("utf-8"))
print(str1,type(str1))

结果:

2021
b'abcefg' <class 'bytes'>

注意 Addstr 传入测参数要转换成byte类型

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的类型是需要显式转换

以上就是Python调用golang代码详解的详细内容,更多关于Python调用golang的资料请关注脚本之家其它相关文章!

相关文章

  • python将pandas datarame保存为txt文件的实例

    python将pandas datarame保存为txt文件的实例

    今天小编就为大家分享一篇python将pandas datarame保存为txt文件的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • Python实现电视里的5毛特效实例代码详解

    Python实现电视里的5毛特效实例代码详解

    这篇文章主要介绍了Python实现了电视里的5毛特效,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Python使用matplotlib绘制正弦和余弦曲线的方法示例

    Python使用matplotlib绘制正弦和余弦曲线的方法示例

    这篇文章主要介绍了Python使用matplotlib绘制正弦和余弦曲线的方法,结合实例形式分析了Python调用matplotlib库进行图形绘制想具体操作技巧,需要的朋友可以参考下
    2018-01-01
  • 使用pytorch进行图像的顺序读取方法

    使用pytorch进行图像的顺序读取方法

    今天小编就为大家分享一篇使用pytorch进行图像的顺序读取方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • pytorch中.to(device) 和.cuda()的区别说明

    pytorch中.to(device) 和.cuda()的区别说明

    这篇文章主要介绍了pytorch中.to(device) 和.cuda()的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • 基于Python实现一个PDF特殊字体提取工具

    基于Python实现一个PDF特殊字体提取工具

    在PDF文档处理场景中,我们常常需要针对特定格式的文本内容进行提取分析,本文介绍的"PDF特殊字体提取器"是一款基于Python开发的桌面应用程序感兴趣的小伙伴跟着小编一起来看看吧
    2025-03-03
  • Python保存数据到文件的实现方式

    Python保存数据到文件的实现方式

    这篇文章主要介绍了Python保存数据到文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 超详细图解修改pip install默认安装路径的方法

    超详细图解修改pip install默认安装路径的方法

    windows环境下Python pip安装库的时候,默认安装在c盘,下面这篇文章主要给大家介绍了关于修改pip install默认安装路径的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • tensorboard显示空白的解决

    tensorboard显示空白的解决

    今天小编就为大家分享一篇tensorboard显示空白的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Python PyCharm如何进行断点调试

    Python PyCharm如何进行断点调试

    这篇文章主要介绍了Python PyCharm如何进行断点调试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07

最新评论