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

相關文章
相關標籤/搜索