会玩Go!会玩Python!嘭!Go-Python!

Go调用Python by go-python3 阅读详情

640?wx_fmt=jpeg

会玩Go!会玩Python!嘭!Go-Python!
PPAP大叔

Golang是静态语言,性能很好,当它不那么灵活,不好在运行时动态运行代码。Python是动态语言,非常灵活,但是性能很差。古人云:“鱼和熊掌不能兼得”。但是如今有了Go-Python,鱼和熊掌也可以兼得。

首先安装go-python

go get github.com/sbinet/go-python

我们使用下面的代码启动Python命令行解释器 go run test.go

// file test.go
package main

import (
	"github.com/sbinet/go-python"
	"os"
)

func init() {
	err := python.Initialize()
	if err != nil {
		panic(err.Error())
	}
}

func main() {
	rc := python.Py_Main(os.Args)
	os.Exit(rc)
}

代码很简单,先初始化,然后将命令行参数传递进Py_Main函数就可以进入Python命令行解释器,就像直接敲python命令一样

640?wx_fmt=jpeg

如果我们执行 go run main.go --version就可以查看Python版本信息

640?wx_fmt=jpeg

接下来我们使用golang打印一下Python环境的sys.path变量

package main

import (
	"fmt"
	"github.com/sbinet/go-python"
)

func init() {
	err := python.Initialize()
	if err != nil {
		panic(err.Error())
	}
}

func main() {
	m := python.PyImport_ImportModule("sys")
	if m == nil {
		fmt.Println("import error")
		return
	}
	path := m.GetAttrString("path")
	if path == nil {
		fmt.Println("get path error")
		return
	}
	size := python.PyList_GET_SIZE(path)
	for i := 0; i < size; i++ {
		item := python.PyList_GET_ITEM(path, i)
		s := python.PyString_AsString(item)
		fmt.Println(s)
	}
}

首先调用PyImport_ImportModule导入sys包,然后取出path对象,再获取path的长度,使用循环挨个取出列表中的字符串,打印出来

640?wx_fmt=jpeg

我们看到默认sys.path里面没有包含当前目录,这意味着不能直接在当前目录导入模块。

接下来我们在sys.path里面加入当前目录

package main

import (
	"fmt"
	"github.com/sbinet/go-python"
)

func init() {
	err := python.Initialize()
	if err != nil {
		panic(err.Error())
	}
}

func main() {
	m := python.PyImport_ImportModule("sys")
	if m == nil {
		fmt.Println("import error")
		return
	}
	path := m.GetAttrString("path")
	if path == nil {
		fmt.Println("get path error")
		return
	}
	//加入当前目录,空串表示当前目录
	currentDir := python.PyString_FromString("")
	python.PyList_Insert(path, 0, currentDir)

	size := python.PyList_GET_SIZE(path)
	for i := 0; i < size; i++ {
		item := python.PyList_GET_ITEM(path, i)
		s := python.PyString_AsString(item)
		fmt.Println(s)
	}
}

我们在sys.path列表的头部插入了空串,表示将当前目录加入sys.path,于是当前目录成为优先查找路径。

有了上面的代码,我们可以试一试调用自定义python模块了,先写一个斐波那契级数

# fib.py
def fib(n):
    if n <= 2:
        return 1
    return fib(n-1) + fib(n-2)

这是一个递归版本的实现,n的大小不能超过最大栈深,好,下面使用go调用它

package main

import (
	"fmt"
	"github.com/sbinet/go-python"
)

func init() {
	err := python.Initialize()
	if err != nil {
		panic(err.Error())
	}
}

func main() {
	m := python.PyImport_ImportModule("sys")
	if m == nil {
		fmt.Println("import error")
		return
	}
	path := m.GetAttrString("path")
	if path == nil {
		fmt.Println("get path error")
		return
	}
	//加入当前目录,空串表示当前目录
	currentDir := python.PyString_FromString("")
	python.PyList_Insert(path, 0, currentDir)

	m = python.PyImport_ImportModule("fib")
	if m == nil {
		fmt.Println("import error")
		return
	}
	fib := m.GetAttrString("fib")
	if fib == nil {
		fmt.Println("get fib error")
		return
	}
	out := fib.CallFunction(python.PyInt_FromLong(10))
	if out == nil {
		fmt.Println("call fib error")
		return
	}
        fmt.Printf("fib(%d)=%d\n", 10, python.PyInt_AsLong(out))
}

因为当前目录已经插入sys.path,我们可以直接使用PyImport_ImportModule导入fib模块,然后获取fib函数对象,注意函数也是一个PyObject对象。将整数10传递进fib函数,得到结果打印出来。

640?wx_fmt=jpeg

接下来我们尝试在自定义模块里使用requests访问一下百度首页,如果能使用第三方Python模块,那么go-python也就比较Ok了。

# reqbaidu.py

import requests

def touch_baidu():
    res = requests.get("http://www.baidu.com")
    return res

// test.go

package main

import (
	"fmt"
	"github.com/sbinet/go-python"
)

func init() {
	err := python.Initialize()
	if err != nil {
		panic(err.Error())
	}
}

func main() {
	m := python.PyImport_ImportModule("sys")
	if m == nil {
		fmt.Println("import error")
		return
	}
	path := m.GetAttrString("path")
	if path == nil {
		fmt.Println("get path error")
		return
	}
	//加入当前目录,空串表示当前目录
	currentDir := python.PyString_FromString("")
	python.PyList_Insert(path, 0, currentDir)

	m = python.PyImport_ImportModule("reqbaidu")
	if m == nil {
		fmt.Println("import error")
		return
	}
	touchBaidu := m.GetAttrString("touch_baidu")
	if touchBaidu == nil {
		fmt.Println("get touch_baidu error")
		return
	}
	res := touchBaidu.CallFunction()
	if res == nil {
		fmt.Println("call touch_baidu error")
		return
	}
	statusCode := res.GetAttrString("status_code")
	content := res.GetAttrString("content")
	fmt.Println(python.PyInt_AS_LONG(statusCode))
	fmt.Println(python.PyString_AS_STRING(content))
}

touchBaidu返回的是一个requests.Response对象,该对象里的属性status_code表示返回状态码,content属性表示返回内容。

640?wx_fmt=jpeg

何时使用go-python

  1. 你需要一个功能,没有开源的go实现,但是python有,并且性能不是很重要

  2. 你需要一个脚本语言嵌入到go中,让go代码获得动态能力

  3. 你想使用Cython干一些hack的事但是又不想撸C语言

go-python有什么缺点

  1. python虚拟机是全局的,意味着线程不安全,在必要的地方要使用GIL保护

  2. python会拖慢golang的性能,在性能重要的场合谨慎使用

640?wx_fmt=jpeg

golang调用python实战 简介 go-python Python提供了丰富的C-API。而C和Go又可以通过cgo无缝集成。所以,直接通过Golang调用libpython,就可以实现Go调Python的功能了。但是过程比较复杂,而go-python提供了针对CPython-2的C-API提供了native-binding能力,方便实现了Go到Python的调用。 但是目前,go-python只支持python2.7。 pkg-config go-python使用pkg-config来获取python的头文件及库信息。 ​ 一般来说 阅读详情

相关推荐

golang python解释器_Golang与Python的亲密接触

会玩Go!会玩Python!嘭!Go-Python!—— PPAP大叔Golang是静态语言,性能很好,当它不那么灵活,不好在运行时动态运行代码。Python是动态语言,非常灵活,但是性能很差。古人云:“鱼和熊掌不能兼得”。但是如今有了Go-Python,鱼和熊掌也可以兼得。首先安装go-pythongo get github.com/sbinet/go-python我们使用下面的代码启动Pyth...

weixin_39620662的博客 468

go-python 库使用详解

Go-Python库是一个用于在Go语言中调用Python代码的工具库,它提供了丰富的接口和工具,使得Go语言可以与Python进行无缝交互。通过Go-Python库,开发人员可以在Go代码中直接调用Python函数、创建和操作Python对象、执行Python脚本等,实现了两种编程语言的混合编程。跨语言编程:Go-Python库提供了一种简单而灵活的方法,使得Go语言可以与Python进行跨语言编程,充分发挥两种编程语言的优势。丰富生态系统。

繁依Fanyi的博客 4808

FreeRTOS实战:如何避免HAL_Delay在高优先级中断中的坑(附TIM6配置指南)

本文深入剖析了在STM32 FreeRTOS项目中,于高优先级中断内调用HAL_Delay函数导致系统假死的根本原因——SysTick时基被FreeRTOS占用且优先级最低。文章提供了治本方案:通过配置TIM6作为独立且最高优先级的HAL时基,实现与FreeRTOS系统心跳的解耦,并附上详细的CubeMX配置与代码移植指南,确保系统实时性与稳定性。

weixin_29230059的博客 65

go-python3初体验

go-python3

weixin_44288092的博客 732

Atlas 300I Pro推理卡性能深度测试:对比业界同类产品的能效比与算力表现

本文对昇腾Atlas 300I Pro推理卡进行了深度性能评测,重点对比了其与业界同类产品的能效比与算力表现。实测数据显示,该卡在运行BERT等模型时展现出高达39.6句子/秒/瓦的卓越能效比,电力成本可降低40%以上,同时其达芬奇架构和硬件加速特征检索能力,为高密度在线推理和向量检索场景提供了强大支撑。

weixin_29031161的博客 579

AI自主网络攻击技术深度解析:从LLM驱动到防御体系升级

网络安全领域正经历从自动化脚本到智能自主攻击的范式转变。其核心原理在于将大型语言模型(LLM)与自动化渗透测试框架深度融合,构建具备环境感知、决策规划和自适应能力的攻击系统。这种技术的核心价值在于实现了从预设步骤到目标驱动的质变,能自主完成信息收集、漏洞利用、横向移动等复杂攻击链。在应用场景上,它不仅能极大提升高级持续性威胁(APT)的攻击效率,也对渗透测试和红队演练技术提出了新的要求。面对此类由AI驱动的自主攻击,传统的基于签名的防御体系已显不足,必须转向以行为分析和零信任为核心的整体纵深防御。本次曝光的

weixin_34254464的博客 610

【Python+C+Golang】在Go中使用go-python调用python模块--内部借助Python/C API 来调用Python

本文记录debug经验 API PyObject* PyImport_ImportModule(const char *name) //Return value: New reference. 返回__import__(name) 使用此API在Go中导入Python的模块。 Python代码如下: hello.py: import numpy import sklearn a=10 def b(xixi): return xixi+"haha" print("calling py

IDoWhatIDo_92761的博客 1758

2025年下半年网络工程师案例分析真题及答案解析

2025年下半年网络工程师案例分析真题及答案解析

鹿鸣天涯 1094

Go和python的混合编程方案-二

通过 cgo 将 Python 代码编译成共享库,直接在 Go 中调用。这种方式性能较好,但实现较为复杂。建议根据实际需求选择最适合的方案,可以从简单的方案开始,随着需求的变化再逐步优化。ZeroMQ 提供了高性能的消息队列功能,适合处理大量数据。使用 Redis 作为数据传输中介,适合分布式环境。适合于同一机器上的进程间通信,实现简单且性能不错。

远方雪的专栏 1220

Open-Sora代码详细解读(1):解读DiT结构

目前开源的DiT视频生成模型不是很多,Open-Sora是开发者生态最好的一个,涵盖了DiT、时空DiT、3D VAE、Rectified Flow、因果卷积等Diffusion视频生成的经典知识点。本篇博客从Open-Sora的代码出发,深入解读背后的原理。

沉迷单车的追风少年 2265

【ARMv9 DSU-120 系列 1 -- DSU-120 DynamIQ 概述】

ARMv9架构中的DynamIQ™ Shared Unit-120(简称DSU-120)为一组基于Cortex-A类架构的核心提供了共享的L3内存系统、窥探控制(snoop control)和 过滤(filtering) 以及其他支持集群运作的控制逻辑。这个集群被称为DSU-120 DynamIQ™集群。此外,所有连接到片上系统(SoC)的外部接口也都是通过DSU-120提供的。一个DSU-120 DynamIQ™集群可以包含1到14个核心,且同一集群中可包含多达三种不同类型的核心。

CodingCos的博客 1189

go语言调用python_Golang 执行Python脚本

一、两种方式通过命令行的方式调用python脚本github.com/sbinet/go-python二、实现1、通过命令行的方式调用python脚本在golang对jpg图片dpi操作未提供原生的相关接口,只好依赖python脚本达到想要的目的main.pyfrom PIL import Image as ImagePIL, ImageFont, ImageDrawimport base64im...

weixin_39881167的博客 1439

【AUTOSAR-E2E】-2.3-配置E2E:基于E2EPW配置一个RX接收的Signal Group(使用E2E Profile 1)

《共13页精讲》:此法也适用于E2E Profile 4/5/6/7/11/22 目录 1 检查CAN Matrix Arxml/DBC是否满足E2E需求 2 在DaVinci Developer中为Port添加E2E保护 3 在DaVinci Configurator settings设置 4 如何使用应用层的E2E保护 5 结尾 <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <-.

「汽车电子助手」的博客 3953

go语言调用python脚本_Golang调用Python

Python是时髦的机器学习御用开发语言,Golang是大红大紫的新时代后端开发语言。Python很适合让搞算法的写写模型,而Golang很适合提供API服务,两位同志都红的发紫,这里就介绍一下正确搅基的办法。原理Python提供了丰富的C-API。而C和Go又可以通过cgo无缝集成。所以,直接通过Golang调用libpython,就可以实现Go调Python的功能了。确实没啥神奇,只要会用C调...

weixin_36381252的博客 1647

基于知识图谱的时空事件关联推理能力培养

随着信息技术的飞速发展,大量的时空事件数据被产生和收集,如交通流量数据、气象观测数据、社交媒体上的地理定位信息等。这些数据蕴含着丰富的知识和规律,但要从中提取有价值的信息并非易事。基于知识图谱的时空事件关联推理旨在通过构建知识图谱,将时空事件数据进行整合和关联,从而实现对事件之间潜在关系的挖掘和推理。本文的目的是系统地介绍基于知识图谱的时空事件关联推理能力的培养方法,包括核心概念、算法原理、数学模型、实际应用等方面。

操作系统内核探秘的博客 752

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

go语言执行python代码_Golang 执行Python脚本

一、两种方式通过命令行的方式调用python脚本github.com/sbinet/go-python二、实现1、通过命令行的方式调用python脚本在golang对jpg图片dpi操作未提供原生的相关接口,只好依赖python脚本达到想要的目的main.pyfrom PIL import Image as ImagePIL, ImageFont, ImageDrawimport base64im...

weixin_39562554的博客 1346

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

go调用python脚本_Golang调用Python

摘要:Python是时髦的机器学习御用开发语言,Golang是大红大紫的新时代后端开发语言。Python很适合让搞算法的写写模型,而Golang很适合提供API服务,两位同志都红的发紫,这里就介绍一下正确搅基的办法。 ![干他一炮.jpg](http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/f5ad9d2dbd36c37ef742c7be6998...

weixin_39746241的博客 436

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Golang调用Python

在Python的解释器中,使用广泛的是CPython,对于Python的编译,除了可以采用以上解释器进行编译外,技术高超的开发者还可以按照自己的需求自行编写Python解释器来执行Python代码,十分的方便!当从Python官方网站下载并安装好Python2.7后,就直接获得了一个官方版本的解释器Cpython,这个解释器是用C语言开发的,所以叫CPython,在命名行下运行python,就是启动CPython解释器,CPython是使用最广的Python解释器。...

m0_71327177的博客 3556

知乎用Go替代Python,是否说明Go比Python好?,Golang面试问题和答案

此外,毕竟 Python 的生态,在这么多编程语言中,是数一数二的,Go 虽热,但在社区方面恐怕还是比不上 Python、PHP,这也是一个现实问题。不得不说,Go的协程,一个“go”就能解决绝大多数问题,确实写代码很简洁,Python 新添的 asyncio 还是相对复杂,Future、Task等等还是有不少门道的。所以,技术永远只有合适的,而没有最佳的,也没有非此即彼的好坏分明。随着知乎用户的迅速增长和业务复杂度的持续增加,核心业务的流量在过去一年内增长了好几倍,对应的服务端的压力也越来越大。

2301_82244608的博客 755

golang和python_Golang调用Python-Go语言中文社区

摘要:Python是时髦的机器学习御用开发语言,Golang是大红大紫的新时代后端开发语言。Python很适合让搞算法的写写模型,而Golang很适合提供API服务,两位同志都红的发紫,这里就介绍一下正确搅基的办法。 ![干他一炮.jpg](http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/f5ad9d2dbd36c37ef742c7be6998...

weixin_39842519的博客 128

go语言调用python_golang和python互相调用

综述golang和python之间,当前可以通过golang的cgo和python的ctypes,把golang对象和python对象分别转换为C对象,从而通过编译和调用c的动态连接库,完成交互。python调用golang:go 函数实现://libadd.gopackage mainimport "C"//export addfunc add(left, right int) int {ret...

weixin_39999190的博客 1190

golang调用python

Python语言作为当下最红的语言,此文将演示如何通过Go语言来为Python脚本语言编写扩展模块。

weixin_42181179的博客 1682

为什么我们从 Python 切换到 Go_python go,Golang开发技术总结

8954612)]

2401_84264429的博客 1154

go语言调用python_Golang中调用Python3

最近有一个项目需要在服务端调用Python3.7写的算法,网上找了一圈,发现两个库都使用cgo特性调用了Python的C-API:针对Python2:https://github.com/sbinet/go-python​github.com针对Python3:https://github.com/DataDog/go-python3​github.com由于我这边的算法是Python3.7写的,...

weixin_39622988的博客 587
上一篇: Java与CPU缓存的亲密接触之「伪共享」
下一篇: GopherLua基础入门
码洞
博客等级 码龄10年 41粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值