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