python与go结合_Go+Python双剑合璧

目的

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

实验场景

做一个功能:二维码识别

Python里面其实有些库是能够做二维码识别的。但是要是是依赖比较严重,要不就是不支持Python3。另外,发现Go里面有个开源的二维码识别项目。这里就让Python调用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() {}

需要特别注意的是,在方法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++要好太多了,你们说呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值