目的

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

Go+Python双剑合璧的更多相关文章

  1. MarkDown、Vim双剑合璧

    作为一名软件攻城狮(是的,我从来都以攻城狮自居! 我坚信如今的每一天,都在朝攻城狮迈进.虽然被菜鸟的肉身皮囊裹着,我依然还是怀着攻城狮的内心! 我非常讨厌别人喊我程序猿.虽然这是不争的事实!).... ...

  2. Spring Cloud & Alibaba 实战 | 第十二篇: 微服务整合Sentinel的流控、熔断降级,赋能拥有降级功能的Feign新技能熔断,实现熔断降级双剑合璧(JMeter模拟测试)

    目录 一. Sentinel概念 1. 什么是Sentinel? 2. Sentinel功能特性 3. Sentinel VS Hystrix 二. Docker部署Sentinel Dashboar ...

  3. ViewBinding 与 Kotlin 委托双剑合璧

    请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · Android-NoteBook 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭 ...

  4. [转帖]双剑合璧:CPU+GPU异构计算完全解析

    引用自:http://tech.sina.com.cn/mobile/n/2011-06-20/18371792199.shtml 这篇文章写的深入浅出,把异构计算的思想和行业趋势描述的非常清楚,难得 ...

  5. ASP.NET Core和Angular 2双剑合璧

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:两个还没有正式发布的东西一起用,是什么效果? 效果当然会很好了(我猜的),那么如何在A ...

  6. JUnit4 与 JMock 之双剑合璧

    引言 单元测试可以保证代码的质量,最大程度降低修复系统 bug 的时间和成本.能被称为测试的阶段有:单元测试.集成测试.系统测试和用户测试.修复系统 bug 的时间和成本随着这些阶段的推移呈指数级增长 ...

  7. 双剑合璧——掌握 cURL 和 Dig 走天涯

    如今随着大量的应用转移到网络,作为开发者,会经常做一些通讯测试,例如从网站获取信息.模拟用户向网站提交或者上传数据,查看应用通讯情况等等,现在变成了非常重要的任务. 一起来认识 cURL cURL 是 ...

  8. AssemblyBuilder以及Activator双剑合璧

    AssemblyBuilder和Activator两个类是DispatchProxy类实现动态代理以及AOP的根本,示例demo可参考 DispatchProxy实现动态代理及AOP .Assembl ...

  9. 双剑合璧的开源项目Kitty-Cloud

    项目地址 https://github.com/yinjihuan/kitty-cloud 背景 做这个项目主要是想将个人的一些经验通过开源的形式进行输出,不一定能帮到所有人,有感兴趣的朋友可以关注学 ...

随机推荐

  1. Mycat实现Mysql主从读写分离

    一.概述 关于Mycat的原理网上有很多,这里不再详述,对于我来说Mycat的功能主要有如下几种: 1.Mysql主从的读写分离 2.Mysql大表分片 3.其他数据库例如Oracle,MSSQL,D ...

  2. VS2017做为Unity3D的脚本编辑器需要的最精简组件

    前言 使用VS2017做为Unity的脚本编辑器,需要的最精简组件. 我的测试环境 windows 10 x64 windows 7 x64 sp1 时间:2017-4-22 更新于2018-12-4 ...

  3. 开发nginx启动脚本及开机自启管理(case)

    往往我们在工作中需要自行写一些脚本来管理服务,一旦服务异常或宕机等问题,脚本无法自行管理,当然我们可以写定时任务或将需要管理的脚本加入自启等方法来避免这种尴尬的事情,case适用与写启动脚本,下面给大 ...

  4. Google开源GSON的使用

    * 谷歌开原项目GitHub地址:https://github.com/google/gson 1.新建一个maven项目,引入gson的dependency坐标依赖以及commons-io的坐标: ...

  5. php学习----面向对象

    面向对象 项目代码都应该由单个能起子程序作用的对象组成 重用性.灵活性.扩展性 变量 $this 代表自身的对象. PHP_EOL 为换行符. PHP 中创建对象 类创建后,我们可以使用 new 运算 ...

  6. Linux 小知识翻译 - 「虚拟化技术 续」

    这次,继续聊聊「虚拟化技术」. 根据上回的介绍,虚拟化技术可以使「计算机的台数和运行的OS的个数的比例不再是1:1」.这回介绍一下如何使用这个技术. 使用方法之一,「一台计算机上运行多个OS」.从个人 ...

  7. Java Native Interface(JNI)

    JNI能让Java代码在Java虚拟机里调用其他编程语言(例如C.C++)写的应用或库,且不会影响任何Java虚拟机的实现. 什么时候用JNI? 1.应用程序所需的平台相关功能,标准的Java类库不支 ...

  8. DbContext 和 ObjectContext两者的区别

    ObjectContext是一种模型优先的开发模式,DbContext是代码优先的开发模式.这是两者最根本的区别. 同时两者之间可以相互转换: 下面给出转换的例子 1.DbContext转为Objec ...

  9. 从 0 → 1,学习Linux该这么开始!

    首先我们还是来普及以下概念,讲点虚的.现在是图形系统的天下,windows我们用了20多年.成功归功与它图形界面,你会点鼠标吗你会敲键盘吗?所以你会上网会聊天会玩游戏了.那么,0基础接触的Linux, ...

  10. centos7下部署mysql主从复制

    首先大致看一下这个图 环境说明: 系统:centos7 IP:master:192.168.7.235 slave:192.168.7.226 mysql版本MySQL-5.7 1.Master 下载 ...