焦点日报:如何实现Python调用Golang代码详解

2023-05-15 11:52:14 来源:脚本之家

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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

标签:

焦点日报:如何实现Python调用Golang代码详解

2023-05-15

广平联社开展安全生产工作会

2023-05-15

年产12.5万吨绿氢!世界首座工业化规模SOEC电解槽生产工厂开工

2023-05-15

最高34℃!雨水已经在路上

2023-05-15

全球观察:中国石油实施的首个配套储能光伏发电项目开工

2023-05-15

天天视讯!外汇市场最新行情走势展望:负面情绪提高美元吸引力 纽元/美元跌至0.6200以下

2023-05-15

全球今日报丨南宁糖业董秘回复:截止5月10日,公司股东人数约3.72万人

2023-05-15

焦点短讯!“衣织涨”会不会一直涨?

2023-05-15

小区物业合同签订流程_小区物业合同范本

2023-05-15

第二回儿娘初试云雨情_第一回初试云雨 世界快看点

2023-05-15

如何面对风险|焦点观察

2023-05-15

项目简介怎么写200字以内_项目简介怎么写 环球快播

2023-05-15

艾滋病窗口期几周可以排除_艾滋病窗口期几周 焦点要闻

2023-05-15

热门:你野辅的大招真好用!EMENES塞拉斯神偷出手 C9轻松拿首局

2023-05-14

杭州传玺房地产代理有限公司_关于杭州传玺房地产代理有限公司概略_世界动态

2023-05-14

焦点热讯:周鸿祎发声:“不会用GPT会被淘汰掉”

2023-05-14

1里路等于多少公里_求生化危机1里基美拉资料

2023-05-14

微资讯!呱呱财经房间密码破解_呱呱财经直播间哪个房间专家讲课好

2023-05-14

现场签约167亿元!长沙工程机械新产品新技术发布暨配套采购签约大会召开 焦点热文

2023-05-14

烟台华夏银行电话_烟台华夏银行

2023-05-14

30万张门票秒空 歌迷“海陆空花样蹭听” 线下演唱会市场有多火热?|独家焦点

2023-05-14

天天亮点!社区也是我的家

2023-05-14

生产工厂生产流程管理_工厂生产管理系统多少钱

2023-05-14

曾游记丨长沙五月又有新展了

2023-05-14

日产的现状:销量全线“崩塌”,会不会成为下一个铃木?

2023-05-14

世界报道:系统教程篇:windows系统共享文件夹访问无需验证_输入用户名和密码即可进入

2023-05-14

全球热头条丨美国男网红为“博眼球” 故意坠机 或将面临最高20年的监禁

2023-05-14

特别版《我记得》,献给每一位母亲|世界短讯

2023-05-14

中国-中亚峰会|专家:中国中亚关系将开启新篇章

2023-05-14

询价方式采购应当遵循的程序_询价方式|当前资讯

2023-05-14

Copyright ©  2015-2022 西南频道网版权所有  备案号:皖ICP备2022009963号-8   联系邮箱:39 60 29 14 2@qq.com