脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - 如何实现Python调用Golang代码详解

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

2023-05-15 16:56AbsoluteCuteness Python

这篇文章主要介绍了如何实现Python调用Golang代码,Python和Golang都是当下非常流行的编程语言,在实际开发中,我们可能会遇到需要将Python和Golang进行组合使用的场景,感兴趣想要详细了解可以参考下文

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

原因:

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

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

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

原因:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//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 官方文档

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

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

?
1
2
3
4
5
6
7
8
9
10
11
# -*- 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内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_42819407/article/details/130638947

延伸 · 阅读

精彩推荐
  • PythonPandas实现Excel文件读取,增删,打开,保存操作

    Pandas实现Excel文件读取,增删,打开,保存操作

    Pandas 是一种基于 NumPy 的开源数据分析工具,用于处理和分析大量数据。本文将通过Pandas实现对Excel文件进行读取、增删、打开、保存等操作,需要的可以参...

    逃逸的卡路里5862023-04-10
  • Python使用pyinstaller打包django的方法实现

    使用pyinstaller打包django的方法实现

    本文主要介绍了使用pyinstaller打包django的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    倔犟的贝壳5572022-01-17
  • PythonPython程序控制语句用法实例分析

    Python程序控制语句用法实例分析

    这篇文章主要介绍了Python程序控制语句用法,结合实例形式分析了Python流程控制语句的条件、循环以及函数、类、文件、异常处理等相关操作使用技巧,需要...

    theVicTory4362020-04-25
  • PythonDjango框架中的对象列表视图使用示例

    Django框架中的对象列表视图使用示例

    这篇文章主要介绍了Django框架中的对象列表视图使用示例,Django是重多Python人气web框架中最为著名的一个,需要的朋友可以参考下...

    脚本之家5692020-07-25
  • PythonPython XlsxWriter模块Chart类用法实例分析

    Python XlsxWriter模块Chart类用法实例分析

    这篇文章主要介绍了Python XlsxWriter模块Chart类用法,结合实例形式分析了Python XlsxWriter模块Chart类功能、图表绘制常用方法及相关操作注意事项,需要的朋友可以...

    cakincqm8902021-06-06
  • PythonPython中requests库的基本概念与具体使用方法

    Python中requests库的基本概念与具体使用方法

    requests库是用python编写的基于urllib,requests唯一的一个非转基因的Python HTTP库,下面这篇文章主要给大家介绍了关于Python中requests库的基本概念与具体使用方法...

    A-L-Kun6822022-08-11
  • Python利用Python计算质数与完全数的方法实例

    利用Python计算质数与完全数的方法实例

    这篇文章主要介绍了利用Python计算质数与完全数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    手机电脑7899682021-09-16
  • PythonPython类的专用方法实例分析

    Python类的专用方法实例分析

    这篇文章主要介绍了Python类的专用方法,实例分析了__init__、__del__、__repr__等专用方法的应用技巧,需要的朋友可以参考下 ...

    脚本之家2462020-05-18