Go+Python双剑合璧
目的
Python调用Go的方法,Python有很多功能强悍又使用简洁的库。而新生军Go的多核心利用率也是非常强悍的。当然这是明面上的优点。反正你有很多理由想要让Python能够调用Go的方法。
实验场景
做一个功能:二维码识别
Python里面其实有些库是能够做二维码识别的。但是要是是依赖比较严重
,要不就是不支持Python3
。另外,发现Go里面有个开源的二维码识别项目。这里就让Python调用Go里面二维码识别接口来完成本次实验。
Go二维码识别库地址:https://github.com/tuotoo/qrcode
现将项目下载回来,删除不必要的文件。放入一个测试用的二维码图片test.png
版本
- Python 3.6.4 :: Anaconda custom (x86_64)
- go version go1.9.6 darwin/amd64
目录结构
├── LICENSE
├── README.md
├── example
│ ├── cpu-profile.prof
│ ├── groups
│ ├── main.go
│ └── test.png
├── qrcode.go
└── version.go
编写Go文件
编辑example/main.go
,如下:
package main
import (
"C"
"fmt"
"os"
qrcode "qrcode-master"
)
//export qrcodeText
func qrcodeText() *C.char {
fi, err := os.Open("./test.png")
if !check(err) {
return C.CString("")
}
defer fi.Close()
qrcode.Debug = false
qrmatrix, err := qrcode.Decode(fi)
check(err)
retq := qrmatrix.Content
return C.CString(retq)
}
func check(err error) bool {
if err != nil {
fmt.Println(err)
}
return err == nil
}
func main() {}
需要特别注意的是,在方法
qrcodeText
上的注释//export qrcodeText
一定要加,这应该是用来生成头文件的。否则等会儿编译动态链接库不会生成*.h
文件
编译动态链接库
go build -buildmode=c-shared -o rqcode.so main.go
以上命令会在当前目录生成 rqcode.so
、rqcode.h
两个文件。
文件目录如下:
├── example
│ ├── cpu-profile.prof
│ ├── groups
│ ├── main.go
│ ├── qrcode.py
│ ├── rqcode.h
│ ├── rqcode.so
│ └── test.png
├── qrcode.go
└── version.go
创建Python文件
在相同的目录下创建qrcode.py
文件,内容如下:
from ctypes import cdll, c_char_p
# 加载动态链接库
lib = cdll.LoadLibrary('rqcode.so')
# 配置输入和输出参数变量类型
lib.qrcodeText.argtypes = None
lib.qrcodeText.restype = c_char_p
# 调用方法
rest = lib.qrcodeText()
print(rest.decode('utf-8'))
开始测试
python qrcode.py
打印出二维码内容:
https://github.com/tuotoo/qrcode
测试过程中发现,有些二维码是无法识别的,所以这个Go的识别库是不完整的。
总结
根据以上测试,可以发现,Python和Go其实可以很好的结合。我们可以用Python快速的实现自己的想法,真的遇到性能瓶颈的时候,用Go重写这部分。当然了,这也是以前Python+C/C++的开发方式,只不过,将C/C++换成了Go。但是Go用起来比C/C++要好太多了,你们说呢?
作者:Li keli
出处:https://www.cnblogs.com/likeli/p/9444036.html
本站使用「署名 4.0 国际」创作共享协议,转载请在文章明显位置注明作者及出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?