Python調用Go的方法,Python有不少功能強悍又使用簡潔的庫。而新生軍Go的多核心利用率也是很是強悍的。固然這是明面上的優勢。反正你有不少理由想要讓Python可以調用Go的方法。python
作一個功能:二維碼識別git
Python裏面其實有些庫是可以作二維碼識別的。可是要是是依賴比較嚴重
,要不就是不支持Python3
。另外,發現Go裏面有個開源的二維碼識別項目。這裏就讓Python調用Go裏面二維碼識別接口來完成本次實驗。github
Go二維碼識別庫地址:https://github.com/tuotoo/qrcodegolang
現將項目下載回來,刪除沒必要要的文件。放入一個測試用的二維碼圖片test.png
shell
├── LICENSE ├── README.md ├── example │ ├── cpu-profile.prof │ ├── groups │ ├── main.go │ └── test.png ├── qrcode.go └── version.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
兩個文件。ui
文件目錄以下:rest
├── example │ ├── cpu-profile.prof │ ├── groups │ ├── main.go │ ├── qrcode.py │ ├── rqcode.h │ ├── rqcode.so │ └── test.png ├── qrcode.go └── version.go
在相同的目錄下建立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++要好太多了,大家說呢?