如何实现Python调用Golang代码详解

 更新时间:2023年05月15日 10:44:55   作者:AbsoluteCuteness  
这篇文章主要介绍了如何实现Python调用Golang代码,Python和Golang都是当下非常流行的编程语言,在实际开发中,我们可能会遇到需要将Python和Golang进行组合使用的场景,感兴趣想要详细了解可以参考下文

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

原因:

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

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

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

原因:

//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 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语言的数据类型。

python,ctypes , c 对应类型参考

python 官方文档

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

# -*- coding:utf-8 -*-
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))

再次说明:

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代码详解的文章就介绍到这了,更多相关Python调用golang内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • libreoffice python 操作word及excel文档的方法

    libreoffice python 操作word及excel文档的方法

    这篇文章主要介绍了libreoffice python 操作word及excel文档的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Python渗透测试入门之Scapy库的使用详解

    Python渗透测试入门之Scapy库的使用详解

    Scapy 是一个用来解析底层网络数据包的Python模块和交互式程序,该程序对底层包处理进行了抽象打包,使得对网络数据包的处理非常简便。本文就来聊聊它的具体使用,希望对大家有所帮助
    2023-03-03
  • Python中隐藏的五种实用技巧分享

    Python中隐藏的五种实用技巧分享

    这篇文章主要和大家分享五个Python中隐藏的实用技巧,文中的示例代码讲解详细,对我们学习Python有一定的帮助,感兴趣的小伙伴可以学习一下
    2022-05-05
  • Python爬取酷狗MP3音频的步骤

    Python爬取酷狗MP3音频的步骤

    这篇文章主要介绍了Python爬取酷狗MP3音频的步骤,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-02-02
  • 浅谈numpy 中dot()函数的计算方式

    浅谈numpy 中dot()函数的计算方式

    这篇文章主要介绍了浅谈numpy 中dot()函数的计算方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • OpenCV实现常见的四种图像几何变换

    OpenCV实现常见的四种图像几何变换

    这篇文章主要介绍了利用OpenCV实现的四种图像几何变换:缩放、翻转、仿射变换及透视。文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编学习一下
    2022-04-04
  • python 通过邮件控制实现远程控制电脑操作

    python 通过邮件控制实现远程控制电脑操作

    这篇文章主要介绍了python 通过邮件控制电脑实现远程控制操作,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • python 分割符竖线的具体实现

    python 分割符竖线的具体实现

    竖线作为一种常见的分割符,能够将一行文本或数据按照指定规则分割为多个部分,本文主要介绍了python 分割符竖线的具体实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • python入门for循环嵌套理解学习

    python入门for循环嵌套理解学习

    这篇文章主要介绍了python入门关于for循环嵌套的理解学习,希望大家可以学会并运用到日常工作中,有需要的朋友可以借鉴参考下,希望能够有帮助
    2021-09-09
  • 使用Python设置、更改及移除Word文档密码

    使用Python设置、更改及移除Word文档密码

    给Word文档设置打开密码是常见的Word文档加密方式,如果我们需要对大量的Word文档进行加密、解密处理,Python是一个不错的选择,本文将介绍如何使用Python设置、更改或移除Word文档的加密,需要的朋友可以参考下
    2024-03-03

最新评论