目的

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. MyBatis笔记----报错:Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/ij34/mybatis/applicationContext.xml]: Invocation of init method failed; nested exception is org.sp

    四月 05, 2017 4:51:02 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRef ...

  2. raid1 raid2 raid5 raid6 raid10的优缺点和做各自raid需要几块硬盘

    Raid 0:一块硬盘或者以上就可做raid0优势:数据读取写入最快,最大优势提高硬盘容量,比如3快80G的硬盘做raid0 可用总容量为240G.速度是一样.缺点:无冗余能力,一块硬盘损坏,数据全无 ...

  3. 光盘yum源搭建

    先修改基本的yum原源,使其不生效 cd /etc/yum.repos.d/ mv CentOS-Base.repo CentOS-Base.repo.bak 在修改媒介yum源使其生效 检验是否生效 ...

  4. 约瑟夫环简介,问题以及java实现

    问题:一群猴子排成一圈,按1,2,--.,n依次编号.然后从第一只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,再把它踢出去-------.,如此不停的进行下去,直到最后只剩下一只猴 ...

  5. Java入门(三):变量和运算符

    上次谈到了Java的基本数据类型,今天接着聊Java的变量.运算符. 一.变量 1.变量的分类 变量分为成员变量.局部变量和常量,其中成员变量又分为实例变量.类变量. 2.变量的定义 语法:变量类型( ...

  6. Linux 小知识翻译 - 「/proc 文件夹」

    这次聊聊 「/proc 文件夹」. /proc 文件夹用来保管系统状态相关的文件的特殊文件夹,这个文件夹中有的文件只是内存上的虚拟文件. /proc 文件夹下有些文件可以反映各个进程的运行状态.所以说 ...

  7. March 11th, 2018 Week 11th Sunday

    All good things must come to an end. 好景无常. Love is when the other person's happiness is more importa ...

  8. IntelliJ IDEA 创建maven管理的webapp项目

    因为使用框架时基本需要使用maven管理项目,所以单独写一个搭建maven项目的流程 第一步:  File-->New--Project 第二步:  选择maven框架 第三步:  输入工程id ...

  9. js证书批量生成与打包下载

    前边有提到最近的一个证书生成保存下载打印的需求. 之前实现的是一个单个操作的页面,现在把实现的批量效果和进度效果的代码展示出来. html <button class="btn btn ...

  10. PHP 2 语句 数据类型 字符串函数 常量

    在 PHP 中,有两种基本的输出方法:echo 和 print. 在本教程中,我们几乎在每个例子中都会用到 echo 和 print.因此,本节为您讲解更多关于这两条输出语句的知识. PHP echo ...