有些时候因为效率问题部分代码会 使用Python调用go的编译生成动态链接库
go 代码示例
//add.go
package main

import "C"

//export Add
func Add(a, b int) int {
return a + b
}

//export Addstr
func Addstr(a, b *C.char) *C.char {
merge := C.GoString(a) + C.GoString(b)
return C.CString(merge)
}

// go build -buildmode=c-shared -o add.so add.go
func main() {
}

注意 需要注意的是,这里的注释//export Addstr //export Add 不能省略,因为在编译成.so文件的时候,编译器会寻找这个注释。同时,为了能正常编译,我们也必须导入C这个包。
## 特別注意 //和export 中间不能有空格

注意: 只有int可以不需要转换,直接在go和C直接互相调用
对于不同的类型,需要使用cgo中定义的方法转换,具体可以参考golang-cgo文档。
比如string需要用C.char来传递,C.GoString(s)可以将C.char类型转换为string,反之C.CString可以把string类型转为 *C.char
Python是利用ctypes来跟so模块进行交互,其中存在着一个代码的翻译过程,包括数据类型的翻译,如果需要传参获取接收返回值,需要在golang中将参数按照下表对应,定义成C语言的数据类型。
python,ctypes , c 对应类型参考 python 官方文档:https://docs.python.org/3.5/library/ctypes.html

把代码保存为fib.go,然后我们使用如下命令进行编译:

go build -buildmode=c-shared -o add.so add.go
1
这条命令指定了编译模式为c-shared,编译完成以后,当前文件夹下面会生成一个add.so文件。这就是我们需要用 Python 载入的文件了。
注意: 不同平台下编译的add.so 不能通用,Windows下可以运行的so文件,linux下就不能运行,需要重新编译linux的so文件

python 中调用go模块’
# -*- coding:utf-8 -*-
# @Time : 2020/9/29
# @Author : hllyzms
import ctypes

lib = ctypes.cdll.LoadLibrary('./add.so')

result = lib.Add(2020, 1)
print(result)

add = lib.Addstr #调用go模块
# 显式声明参数和返回的期望类型
add.argtypes = [ctypes.c_char_p, ctypes.c_char_p]
add.restype = ctypes.c_char_p
str1 = add("abc".encode("utf-8"),'efg'.encode("utf-8"))
print(str1,type(str1))

结果:

2021
b'abcefg' <class 'bytes'>
1
2
注意 Addstr 传入测参数要转换成byte类型
go中的*C.char 对应 ctypes 中的c_char_p 对应Python中的bytes object or None
Python与Go之间的参数传递, 处理非INT型时需要都转为对应的C类型
ctypes需要显式地声明DLL函数的参数和返回期望的数据类型
注意在Python3中字符串bytes和string的区别
Go模块需要//export 声明外部可调用
Go处理C的类型是需要显式转换
————————————————
版权声明:本文为CSDN博主「hllyzms」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_37989267/article/details/108869265
-----------------------------------
Python调用golang
https://blog.51cto.com/u_15127511/3456444

Python调用golang的更多相关文章

  1. 深入浅出爬虫之道: Python、Golang与GraphQuery的对比

    深入浅出爬虫之道: Python.Golang与GraphQuery的对比 本文将分别使用 Python ,Golang 以及 GraphQuery 来解析某网站的 素材详情页面 ,这个页面的特色是具 ...

  2. Python与Golang协程异同

    背景知识 这里先给出一些常用的知识点简要说明,以便理解后面的文章内容. 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定 ...

  3. Python调用Prometheus监控数据并计算

    Prometheus是什么 Prometheus是一套开源监控系统和告警为一体,由go语言(golang)开发,是监控+报警+时间序列数 据库的组合.适合监控docker容器.因为kubernetes ...

  4. 【初学python】使用python调用monkey测试

    目前公司主要开发安卓平台的APP,平时测试经常需要使用monkey测试,所以尝试了下用python调用monkey,代码如下: import os apk = {'j': 'com.***.test1 ...

  5. python调用py中rar的路径问题。

    1.python调用py,在py中的os.getcwd()获取的不是py的路径,可以通过os.path.split(os.path.realpath(__file__))[0]来获取py的路径. 2. ...

  6. python调用其他程序或脚本方法(转)

    python运行(调用)其他程序或脚本 在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其他脚本,或者程序提供的功能,而不必再次编写实现该功能的代码.为了更好地 ...

  7. python调用c\c++

    前言 python 这门语言,凭借着其极高的易学易用易读性和丰富的扩展带来的学习友好性和项目友好性,近年来迅速成为了越来越多的人们的首选.然而一旦拿python与传统的编程语言(C/C++)如来比较的 ...

  8. Python调用C++

    /***gcc -o libpycall.so -shared -fPIC pycall.c*/ #include <stdio.h> #include <stdlib.h> ...

  9. 使用Python调用Flickr API抓取图片数据

    Flickr是雅虎旗下的图片分享网站,上面有全世界网友分享的大量精彩图片,被认为是专业的图片网站.其API也很友好,可以实现多种功能.这里我使用了Python调用其API获得了大量的照片数据.需要注意 ...

  10. python调用zabbix接口实现Action配置

    要写这篇博客其实我的内心是纠结的,老实说,我对zabbix的了解实在不多.但新公司的需求不容置疑,当我顶着有两个头大的脑袋懵懵转入运维领域时,面前摆着两百多组.上千台机器等着写入zabbix监控的需求 ...

随机推荐

  1. 报错:selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: missing 'name'

    代码运行到这:driver.add_cookie(cookies),报错了 相信坑了不少人,接下来是解决办法 driver.add_cookie(cookies) cookies = { " ...

  2. Merge Into 语法支持

    KINGBASE 兼容Oracle 语法,实现了merge into 的功能.以下以例子的形式,介绍merge into语法的使用.以下例子在V8R6 ,且 database_mode=oracle ...

  3. 自定义View5 -塔防小游戏:第二篇防御塔随意放置

    第一篇:一个防御塔+多个野怪(简易版) 第二篇:防御塔随意放置 自定义View,处理事件分发,up,move,down. 第三篇:防御塔随意放置+多组野怪 第四篇:多波野怪 第五篇:杀死野怪获得金币 ...

  4. eclipse最常应用的几个快捷键,新手必看!

    首先eclipse快捷键可以使用 Ctrl + Shift + L 打开,在这里可以查看所有快捷键. 另外就是常用的几个快捷键 选中光标所在行 好像没有,但是可以 Ctrl + d 然后 Ctrl + ...

  5. std:move() 作用 和 移动语义后 右值行为,unique_ptr的"移动"操作问题

    unique_ptr 不能进行赋值操作,但是可以有返回unique_ptr的函数,由此产生的问题: 结论1:std:move() 只是将一个实参强行转换为右值引用. 我们知道对象初始化时有 构造函数, ...

  6. mysql数据库log-slave-updates 参数解释

    A(主库) ===> B(从库/主库) ===> C(从库) 需要在B的配置文件中添加log-slave-updates=1 从库做为其他从库的主库时 log-slave-updates ...

  7. Grafana 入门知识介绍

    通过[Configuration]>[Plugins]添加插件 通过[Configuration]>[Data Sources]添加数据源(分析对象) 通过[Server Admin]&g ...

  8. DP 优化小技巧

    收录一些比较冷门的 DP 优化方法. 1. 树上依赖性背包 树上依赖性背包形如在树上选出若干个物品做背包问题,满足这些物品连通.由于 01 背包,多重背包和完全背包均可以在 \(\mathcal{O} ...

  9. Tomcat实战之路

    目录 第一节.安装升级 1.1.linux初始化 1.2.安装 1.3.升级 第二节.配置 2.1.虚拟主机 2.2.默认网站首页路径 2.3.跳转 2.4.配置Tomcat日志 第三节.安全 3.1 ...

  10. Kafka与Flume之集成比较

    Kafka与Flume之集成比较 一.Kafka与Flume比较 在企业中必须要清楚流式数据采集框架flume和kafka的定位是什么:flume:cloudera公司研发: 适合多个生产者: 适合下 ...