zoukankan      html  css  js  c++  java
  • 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.sorqcode.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++要好太多了,你们说呢?

  • 相关阅读:
    SD卡测试
    测试人员可能会遇到的问题
    HDU 1024 Max Sum Plus Plus
    HDU 1176 免费馅饼
    HDU 1257 最少拦截系统
    HDU 1087 Super Jumping! Jumping! Jumping!
    poj 1328 Radar Installation
    poj 1753 Flip Game
    HDU 1003 Max Sum
    HDU 5592 ZYB's Premutation(BestCoder Round #65 C)
  • 原文地址:https://www.cnblogs.com/likeli/p/9444036.html
Copyright © 2011-2022 走看看