http://blog.yuanzhaoyi.cn/2018/06/27/golang_python.html

python3-ctypes: https://docs.python.org/3.5/library/ctypes.html#ctypes.c_wchar_p

golang-cgo: https://golang.org/cmd/cgo/#hdr-Go_references_to_C

综述

golang和python之间,当前可以通过golang的cgo和python的ctypes,把golang对象和python对象分别转换为C对象,从而通过编译和调用c的动态连接库,完成交互。

python调用golang:

go 函数实现:

//libadd.go
package main import "C" //export add
func add(left, right int) int {
return left + right
} func main() {
}

通过c-shared模式编译成so:

go build -buildmode=c-shared -o libadd.so libadd.go

python调用so:

from ctypes import cdll
lib = cdll.LoadLibrary('./libadd.so')
print("Loaded go generated SO library")
result = lib.add(2, 3)
print(result)

注意: 只有int可以不需要转换,直接在go和C直接互相调用

对于不同的类型,需要使用cgo中定义的方法转换,具体可以参考golang-cgo文档。

比如string需要用C.char来传递,C.GoString(s)可以将C.char类型转换为string,反之C.CString可以把string类型转为 *C.char

使用举例:

package main

import "C"
import (
"github.com/ppmoon/gbt2260"
"strings"
) //export parsecode
func parsecode(s *C.char) (*C.char){
code := C.GoString(s)
region := gbt2260.NewGBT2260()
localCode := region.SearchGBT2260(code)
if len(localCode) < 3 {
return C.CString("没有匹配上,,")
}
ret := strings.Join(localCode, ",")
return C.CString(ret)
} //export add
func add(left, right int) int {
return left + right
} func main() { }

编译.so:

go build -buildmode=c-shared -o ~/Develop/law_dev/law_service/util/parseareacode.so test_other.go

python调用:

用.argtype和.restype可以定义调用动态连接库函数的传入和传出参数

# 通过golang的"github.com/ppmoon/gbt2260"包解析area code
import os
from ctypes import cdll, c_char_p current_path = os.path.dirname(os.path.realpath(__file__))
lib = cdll.LoadLibrary(current_path + '/parseareacode.so')
parsecode = lib.parsecode def get_list(area_code):
parsecode.argtype = c_char_p
parsecode.restype = c_char_p
result = lib.parsecode(area_code.encode("utf-8"))
return result.decode("utf-8").split(",")

简单总结

Python与Go之间的参数传递, 处理非INT型时需要都转为对应的C类型
ctypes需要显式地声明DLL函数的参数和返回期望的数据类型
注意在Python3中字符串bytes和string的区别
Go模块需要//export 声明外部可调用
Go处理C的类型是需要显式转换

golang和python互相调用的更多相关文章

  1. DES对称加密算法实现:Java,C#,Golang,Python

    数据加密标准(DES,Data Encryption Standard,简写DES)是一种采用块密码加密的对称密钥算法,加密分组长度为64位,其中8.16.24.32.40.48.56.64 等8位是 ...

  2. python子类调用父类的方法

    python子类调用父类的方法 python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法.如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问, ...

  3. Python之调用函数

    Python之调用函数 Python内置了很多有用的函数,我们可以直接调用. 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数 abs,它接收一个参数. 可以直接从Python的官方网站查 ...

  4. Python下调用Linux的Shell命令

    有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法: 1. os 模块 ...

  5. Python脚本传參和Python中调用mysqldump

    Python脚本传參和Python中调用mysqldump<pre name="code" class="python">#coding=utf-8 ...

  6. 2017年的golang、python、php、c++、c、java、Nodejs性能对比(golang python php c++ java Nodejs Performance)

    2017年的golang.python.php.c++.c.java.Nodejs性能对比 本人在PHP/C++/Go/Py时,突发奇想,想把最近主流的编程语言性能作个简单的比较, 至于怎么比,还是不 ...

  7. 2017年的golang、python、php、c++、c、java、Nodejs性能对比[续]

    2017年的golang.python.php.c++.c.java.Nodejs性能对比[续] 最近忙,这个话题放了几天,今天来个续集.   上篇传送门: 2017年的golang.python.p ...

  8. golang与python多线程的并发速度

    一.golang的代码 package main import ( "fmt" "time" ) func Text_goroute(a int, b int) ...

  9. python 可调用对象之类实例

    可调用对象,即任何可以通过函数操作符()来调用的对象. python可调用对象大致可以分为4类: 1.函数 python中有三种函数:内建函数(BIFs).用户自定义函数(UDF).lambda表达式 ...

随机推荐

  1. T-SQL 简介

    1. 变量说明语句:用来说明变量的命令. 2. 数据定义语言(Data Definition Language,DDL):用来建立数据库和定义列等数据结构,主要是create table,drop d ...

  2. USACO19JAN Gold题解

    噩梦的回忆.. 上周日在机房打的模拟赛,结果十分惨烈,就最后一题yy出了正解结果玄学的只拿了80 考试结果:0+0+80=80 订正时对着T3打了2hours结果还是90 订正结果:100+100+9 ...

  3. 关于XSS攻击

    1.XSS XSS(Cross Site Scripting)攻击全称跨站脚本攻击,为了不与CSS(Cascading Style Sheets)混淆,故将跨站脚本攻击缩写为XSS,XSS是一种经常出 ...

  4. 阿里云cdn缓存设置技巧,不同文件结尾用不同的缓存时间

    https://edu.aliyun.com/lesson_130_1505?spm=5176.10731542.0.0.2ed37dbf42YL6U#_1505

  5. npm ERR! Cannot read property 'resolve' of undefined

    一 .有可能是版本过低,或者软件损坏,重新安装一下试试 地址

  6. paramiko简介

    一.什么是paramiko 要想明白什么是paramiko,要先明白ssh协议. 二.什么是ssh协议 ssh全称是Secure Shell (翻译:安全的外壳),根据字面意思就可以知道是和安全相关的 ...

  7. jQuery 源码分析(四) each函数 $.each和$.fn.each方法 详解

    $.each一般用来遍历一个数组或对象,$.fn.each()就是指jQuery实例可以执行的操作(因为$.fn是jQuery对象的原型) $.each用来遍历一个数组或对象,并依次执行回掉函数,最后 ...

  8. UVA 10790 How Many Points of Intersection? 组合数学

    We have two rows. There are a dots on the top row and b dots on the bottom row. We draw line segment ...

  9. 修改Hexo自动生成的HTML文件名

    导读 我们在使用Hexo框架生成静态博客时,其实是将你写好的.md文件输出成HTML文件进行渲染,其中HTML的文件名称就是.md的文件名称. 而我们为了编辑文章方便,为了通过文件名就知道这是哪篇文章 ...

  10. 你不得不知的Golang线程模型 [转载]

    原著:翟陆续(加多) 资深Java , 著Java并发编程之美 一.前言 本节我们来探讨Go的线程模型,首先我们先来回顾下常见的三种线程模型,然后在介绍Go中独特的线程模型. 二.三种线程模型 线程的 ...