Go+Python双剑合璧

目的

Python调用Go的方法,Python有不少功能强悍又使用简洁的库。而新生军Go的多核心利用率也是很是强悍的。固然这是明面上的优势。反正你有不少理由想要让Python可以调用Go的方法。python

实验场景

作一个功能:二维码识别git

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

Go二维码识别库地址:https://github.com/tuotoo/qrcodegolang

现将项目下载回来,删除没必要要的文件。放入一个测试用的二维码图片test.pngshell

版本

  • 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.sorqcode.h两个文件。ui

文件目录以下:rest

├── example
│   ├── cpu-profile.prof
│   ├── groups
│   ├── main.go
│   ├── qrcode.py
│   ├── rqcode.h
│   ├── rqcode.so
│   └── test.png
├── qrcode.go
└── version.go

建立Python文件

在相同的目录下建立qrcode.py文件,内容以下:code

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++要好太多了,大家说呢?

相关文章
相关标签/搜索