首页 > 编程语言 >python与go的对接

python与go的对接

时间:2023-05-09 11:12:33浏览次数:55  
标签:调用 python 对接 so build go main

python与go的对接

在项目中遇到的问题,go写的程序需要被python调用,要将项目打包成.so文件

首先要确保go build能编译出可执行文件,再打包成.so文件,因为原理与go build是一样的

编译

用测试项目来记录解决过程

测试环境:windows64

源码目录结构:

---test
|___Add___add.go
|___main___main.go

给python调用需要在被调用的函数前加上

//export 函数名

并引入import "C"包,这是后面编译出现问题的主要原因

遇到的问题

进行的操作:

在test目录下直接go bulid,报错,提示必须要有 go 文件

 于是进入main包,执行go build -o main,报错

 这个错误是因为在 32 位的 Windows 操作系统上使用了 64 位版本的 Go,或者是因为在 64 位的 Windows 操作系统上使用了不支持 64 位编译的 C 编译器。

于是修改环境变量

SET CGO_ENABLED=1   
SET GOARCH=amd64
SET CC=x86_64-w64-mingw32-gcc.exe

说明:

1、CGO_ENABLED 表示是否开启cgo,因为引入了“C”包,如果不开启会报 cgo 的错误,如下图

 2、python平台也是Windows,需要设置 GOARCH 为64位平台,对方才能调用

3、这个部分是报错的原因,要先重新下载 mingw32 ,之前下载的环境是32位系统,参考,再修改环境变量

原来的环境变量如下,用作备份

 

最后可以成功build,此时就可以打包成.so

可参考https://blog.csdn.net/u012474395/article/details/120615372

打包

如果是一个单独的 go 文件,只需要在文件中包含一个空的 main 函数,并在函数头部注释//export 函数名,函数名首字母大写即可供 python 调用

在终端输入

 go build -buildmode=c-shared -o mylib.so ./main.go

即可产生mylib.so文件,python可以引用

第一个参数是打包后的共享库名字,第二个参数是文件路径位置,./表示当前路径

如果是需要打包项目,需要进入项目目录下,执行

 go build -buildmode=c-shared -o mylib.so ./...

python调用

python调用的时候也遇到了一些问题

1、go 函数入参为[]byte类型,但是python经过处理后,传过来的内容与预期不同,python 那边也不知道什么问题,个人感觉可能是因为 python 的 bytes 类型是16 进制存储,而 go 的[]byte是10进制存储,导致互相转化的结果不一样

2、于是我修改 go 的传参为 string类型,在内部处理为[]byte,发现又报内存溢出错误,可能是由于 go 的字符串底层是一个结构体,包含指针,而 C 语言的字符串底层就是一个*char指针,在调用时容易内存溢出?

 在查阅资料后,将传参修改为*C.char类型,同时 python 在调用时,进行一些处理,即可调用

python 的处理如下

# 限制函数传参的返回类型
lib.my_func.argtypes = [c_char_p]
lib.my_func.restype = c_char_p
# 字符串处理
teststr='012def'
test_byte = teststr.encode("utf-8")

最后补充一个表, python,ctypes , c 对应类型

 

 

标签:调用,python,对接,so,build,go,main
From: https://www.cnblogs.com/hackcaixukun/p/17384268.html

相关文章

  • django系列-环境及纯净配置
    一、安装django1.建立虚拟环境venv,Python官方用语创建虚拟环境的工具D:\learn_django>python-mvenvll_env(环境名称)--python=python3.6#可以替换成电脑里其他python版本D:\learn_django>python-mvenvll_env(环境名称)--python='C:\python\python3.6.exe'#可以直......
  • Go源码阅读——github.com/medcl/esm —— esapi.go
    esm(AnElasticsearchMigrationTool)—— esapi.go https://github.com/medcl/esmrelease:8.7.1通过阅读好的源代码,细致思考,理性分析并借鉴优秀实践经验,提高zuoyang的编程水平,所谓"他山之石,可以攻玉" 该是如此吧。 /*Copyright2016Medcl(mATmedcl.net)Licen......
  • python 小技巧, 列表生成式比 filter(lambda x:x>=0,data) 快, iteritems()方法,
    题目经timeit测试列表生成式比filter(lambdax:x>=0,data)快python2的dict的iteritems()方法,pyhton3可以看看有没有......
  • Python_16 session、cookie 鉴权
    一、查缺补漏1.pprint https://www.cnblogs.com/yjybupt/p/10669988.html https://www.cnblogs.com/wongbingming/p/12854618.html 2.鉴权: http://testingpai.com/article/1621929988356 3.importjson json.du......
  • Python爬虫零基础教学第二天
    Python爬虫高级开发/大数据抓取/从入门到精通/商业项目实战(2)开始时间2023-05-08 21:26:37结束时间2023-05-08 23:08:20一、调试模式的介绍 鼠标右键,在出现的选项中找到检查进入调试模式,或者按键盘上的f12键进入调试模式。  二、Cookie使用cookie进行会话保持 ......
  • 在 Python 中将 Tqdm 与 Asyncio 结合使用
    动动发财的小手,点个赞吧!简介困扰在Python中使用并发编程来提高效率对于数据科学家来说并不罕见。在后台观察各种子进程或并发线程以保持我的计算或IO绑定任务的顺序总是令人满意的。但是还有一点困扰我的是,当我在后台并发处理成百上千个文件或者执行成百上千个进程时,我总......
  • 网络基础 登录对接CAS-跨域导致的一个意想不到的Bug
    登录对接CAS-跨域导致的一个意想不到的Bug背景描述业务需求是平台登录,接入Cas验证问题描述平台登录页,点击登录方式,跳转Cas登录页,提交登录请求,结果发现,又返回平台登录页;再次点击登录方式,登录成功,跳转到目标页面。问题排查排查方向-浏览器兼容性问题这个问题,开发人员在其......
  • django中ORM开启事务
    django中ORM开启事务一、全局开启ATOMIC_REQUESTS设置为True,每个请求过来时,Django会在调用视图方法前开启一个事务。如果请求正确处理并正确返回了结果,Django就会提交该事务,否则,Django会回滚该事务。DATABASES={'default':{'ENGINE':'django.db.backends.mys......
  • Django高级之-cookie与session
    目录1背景信息cookie的介绍cookie的由来什么是cookiecookie的原理Cookie规范Cookie的覆盖在浏览器中查看cookiesession的介绍session的由来什么是sessiontoken的介绍token的由来什么是token?Django操作cookie设置cookie获取cookie删除CookieCookie版登录校验案例Django操作Session......
  • Python - 并发模型
    importitertoolsimporttimefromthreadingimportThread,Eventdefspin(msg:str,done:Event)->None:forcharinitertools.cycle(r'\|/-'):#1status=f'\r{char}{msg}'#2print(status,end=''......