综述

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的类型是需要显式转换

go语言调用python_golang和python互相调用相关推荐

  1. python golang相互调用_golang和python互相调用

    2018 June 27 go, golang, python golang和python互相调用 网站 综述 golang和python之间,当前可以通过golang的cgo和python的ctyp ...

  2. python调用php命令行,python调用php函数 python怎样调用php文件中的函数详解

    前言 python调用php代码实现思路:php文件可通过在terminal中使用php命令行进行调用,因此可使用python开启子进程执行命令行代码.函数所需的参数可通过命令行传递. 测试环境 1. ...

  3. 在python中函数不可以嵌套调用_在Python中调用嵌套函数

    我有一个方法,我已经分解成更小的嵌套函数来分解代码基:def foo(x,y): def do_this(x,y): pass def do_that(x,y): pass do_this(x,y) ...

  4. python静态方法怎么调用_在python中调用静态方法

    你需要做如下事情:class Person(object): #always inherit from object. It's just a good idea... @staticmethod d ...

  5. python中的静态方法如何调用_在python中调用静态方法

    你需要做一些像: class Person(object): #always inherit from object. It's just a good idea... @staticmethod d ...

  6. Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)—命令提示符cmd的几种方法

    Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)-命令提示符cmd的几种方法 目录 利用python语言实现调用内部命令-命令提示符cmd的几种方法 T1. ...

  7. Python语言学习:基于python五种方法实现使用某函数名【func_01】的字符串格式('func_01')来调用该函数【func_01】执行功能

    Python语言学习:基于python五种方法实现使用某函数名[func_01]的字符串格式('func_01')来调用该函数[func_01]执行功能 目录 问题提出 代码五种设计思路 T1方法:e ...

  8. python r语言 结合 部署_(转)python中调用R语言通过rpy2 进行交互安装配置详解...

    python中调用R语言通过rpy2 进行详解 1.R语言的安装: 大家进行R语言的安装,在安装好R后,需要配置环境变量R才能进行使用. 对此电脑右键->选择高级设置->环境变量-> ...

  9. python可以调用c语言编写的底层代码吗_Python基础笔记系列十四:python无缝调用c程序...

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! python语言可以对c程序代码进行调用,以弥补python语言低性能的缺 ...

最新文章

  1. MySql下视图的创建
  2. java学习(31):for循环
  3. sql 左联接 全联接_学习SQL:联接多个表
  4. 〖Linux〗Debian 7.1.0 Wheezy使用ltib报错的解决办法
  5. 金色圣诞幻灯片AE模板
  6. 杭电 hdu 2002
  7. 笔试题:简述以下两个for循环的优缺点
  8. android电视开发远程开关机,一种电视电脑一体机及其实现远程开关机控制的方法...
  9. 字符串循环移位 编程之美3.1
  10. Windows环境下用Anaconda(2.7/3.6)安装GPU版TensorFlow
  11. 模2除法怎么计算,模2除法最简单的理解
  12. Java中的双重检查(Double-Check)详解
  13. 2017服务器cpu性能排行,桌面CPU性能排行榜单 CPU天梯图2017年6月最新版
  14. 移动硬盘接口坏了怎么办解决教程
  15. 销售如何快速有效获客?获客渠道和方式有哪些?
  16. Apache Doris 向量化版本在小米A/B实验场景的调优实践
  17. VC2015编译旧工程找不到头文件stdio.h
  18. 滑动平均滤波/递推平均滤波算法
  19. ArcPy合并相同结构的mdb数据库
  20. 微信小程序地图导航源码、地图导航小程序源码

热门文章

  1. 笔记本怎么添加计算机,笔记本电脑怎么连接打印机|笔记本添加打印机步骤
  2. 使用API制作星际争霸2AI
  3. netty客户端实现
  4. vue + webpack 实用技巧
  5. python模块和类的通用转换规则(2),三步转oo
  6. 深度解析串行并发并行,开发人员需彻底搞懂丨mysql|redis|skynet|协程|索引|读写分离|分布式锁|主从同步
  7. android模拟器steam,退休模拟器steam版
  8. excel打印预览在哪里_Excel各种打印技巧讲解,让你不再为打印问题而发愁了
  9. matlab心音理想滤波,基于matlab的心音信号预处理系统的设计.docx
  10. 阿里云安装多版本mysql_CentOS 6.5 64 安装多个mysql 服务 -阿里云服务器ECS