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

  • 相关阅读:
    jQuery火箭图标返回顶部代码
    易购商城首页
    使用HTML5验证博客园用户注册页面
    正则表达式相关内容和用法
    表单
    jQuery制作图片提示效果
    jQuery遍历
    用js制作论坛发贴
    使用jQuery操作DOM
    京东常见问题分类页面
  • 原文地址:https://www.cnblogs.com/likeli/p/9444036.html
Copyright © 2011-2022 走看看