七叶笔记 » golang编程 » Go+Python双剑合璧

Go+Python双剑合璧

目的

Python 调用Go的方法,Python有很多功能强悍又使用简洁的库。而新生军 go 的多核心利用率也是非常强悍的。当然这是明面上的优点。反正你有很多理由想要让Python能够调用Go的方法。

实验场景

做一个功能:二维码识别

Python里面其实有些库是能够做二维码识别的。但是要是是依赖比较严重,要不就是不支持Python3。另外,发现Go里面有个开源的二维码识别项目。这里就让Python调用Go里面二维码识别接口来完成本次实验。

Go二维码识别库地址:

现将项目下载回来,删除不必要的文件。放入一个测试用的二维码图片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() {}
复制代码  

编译动态链接库

 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. rest ype = c_char_p

# 调用方法
rest = lib.qrcodeText()

print(rest.decode('utf-8'))
复制代码  

开始测试

 python qrcode.py
  

打印出二维码内容:

 
复制代码  

测试过程中发现,有些二维码是无法识别的,所以这个Go的识别库是不完整的。

总结

根据以上测试,可以发现,Python和Go其实可以很好的结合。我们可以用Python快速的实现自己的想法,真的遇到性能瓶颈的时候,用Go重写这部分。当然了,这也是以前Python+C/C++的开发方式,只不过,将C/C++换成了Go。但是Go用起来比C/C++要好太多了,你们说呢?

作者:Li keli

出处:

本站使用「署名 4.0 国际」创作共享协议,转载请在文章明显位置注明作者及出处。

评论,请 登录 或 注册, 访问 网站首页。

Copyright © 2020 LiGoper
Powered by .NET Core on KubernetesPowered By Cnblogs | Theme Silence v1.0.9

相关文章