2018 June 27 go, golang, python

golang和python互相调用

网站

综述

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

python golang相互调用_golang和python互相调用相关推荐

  1. golang 相互引用_golang go run undefined 同一个package中函数互相调用的问题

    golang中同一个package中函数互相调用的问题 同一个packge中(test) a.go package main func main(){ Test() } b.go package ma ...

  2. golang 相互引用_Golang与C互用以及调用C的so动态库和a静态库

    Golang与C的关系非常密切,下面主要介绍在Golang中使用C. 一. Golang中嵌入C代码 1 package main 2 3 //#include 4 //#include 5 /* 6 ...

  3. python文件之间的相互调用_用Python创建功能模块——截取字符串模块

    用Python创建模块 本篇文章小编给大家分享在Python如何创建属于自己的模块,实现更多的功能! 一.模块 模块是什么?简单来说,当程序的功能很多.代码量很大时,我们可以编写一个实现一定功能的py ...

  4. python golang哪个性能高_golang和python哪个比较好?

    golang和python哪个比较好? 发布时间:2020-04-20 15:30:36 来源:亿速云 阅读:206 作者:小新 今天小编给大家分享的是golang和python哪个比较好,相信很多人 ...

  5. golang和python的区别_golang和python的区别

    golang和python的区别 1.可扩展性 任何现代企业中的软件的首要事情之一就是可扩展性. 企业迅速增长,IT系统支持这种增长势在必行.这里值得一提的是,基于Python的Web应用程序很难在单 ...

  6. Python函数详解:函数定义、调用,lambda函数,高阶函数map,filter,reduce,函数式编程,模块化设计、代码复用、函数递归、enumerate()

    一.函数 函数是一段具有特定功能的.可重用的语句组,通过函数名来表示和调用. 函数是一段代码的抽象和封装 函数是一段具有特定功能的.可重用的语句组 函数是一种功能的抽象,表达特定功能 两个作用:降低编 ...

  7. linux+swig+python,linux下使用swig让python调用C++(复杂版:包括多文件调用和链接库)...

    第一次用swig,网上找了各种资料,比如 http://www.cnblogs.com/kaituorensheng/p/4464117.html 入门可以看上面这个链接 但要么过于简单要么过于复杂 ...

  8. 调用另一个python文件中的代码

    python3.*版本下好像不一样,正确引用方法: utils是同级目录,options是文件,后面是函数 from .utils.options import parseOptions from . ...

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

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

最新文章

  1. 20160406作业
  2. 第十五届智能车竞赛芯片选型浅析
  3. Android自定义动态壁纸,Android自定义动态壁纸开发详解
  4. c语言矩阵存储,C语言实现特殊矩阵存储
  5. xshell 设置屏幕字体
  6. 实现根据id查询房源数据的GraphQL服务
  7. UI5界面绘制的机制,以及老旧dom节点的清除机制
  8. 编程的第一步都要使能时钟吗_在您的第一份编程工作中要做的11件事
  9. java计算器如何实现运算_用java编写了一个模拟计算器的界面设计,怎么实现运算功能呢...
  10. java记住用户名和密码_JAVA--高级基础开发Cookie实现记住用户名和密码
  11. python函数式编程:apply, map, lambda和偏函数
  12. w ndows无法完成格式化,Windows无法完成格式化怎么办呢?教你解决U盘问题!
  13. Teambition是什么软件?优缺点是什么?
  14. 浪潮服务器u盘安装系统_浪潮服务器系统安装怎样从光驱引导
  15. 【Error】西部数据磁盘插上不显示盘符
  16. 语音转换文字工具,怎么将语音转换成文字
  17. nodejs.ReferenceError:window is not defined
  18. iText7 学习笔记2--页眉页脚
  19. python换脸GIF动画制作
  20. html可以用多个css样式吗,关于多个页面css样式表问题

热门文章

  1. 腾讯太狠:40亿QQ号, 给你1G内存,怎么去重?
  2. 阿里质量图标(字体图标)
  3. php实现无限极分类算法,PHP无限极分类函数的实现方法实例详解
  4. 目标程序集不包含服务类型。可能需要调整此程序集的代码访问安全策略
  5. JSE2-对象和类基础
  6. solidworks中装配体如何旋转一个零件
  7. 编译型语言和解释型语言之间的区别及特点
  8. crazyflie学习(4):crazyflie飞行与日志
  9. Cocos Creator3.x NavMesh导航网格寻路(一)
  10. 在鸿蒙开发板上使用MQTT协议、OneNET实现第一个物联网项目