会玩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

从零开始之stm32之CAN通信

CAN通信极简教程(小白友好版),从小白的视角了解并实现简单的STM32F103的CAN通信,直接上手。

qq_30993593的博客 1311

go-python3初体验

go-python3

weixin_44288092的博客 732

PINN内嵌物理知识神经网络入门及文献总结

内嵌物理知识深度学习方法(PINN)已经成功用于解决各类科学计算问题,其本质是将物理先验知识嵌入神经网络训练中,将一个求解PDE的问题转化为一个优化问题。这篇博客主要记录PINN相关论文

山里娃的博客 7万+

MapGIS地质剖面图绘制实战:从数据准备到整饰出图

本文详细解析了MapGIS地质剖面图绘制的全流程,从数据准备到整饰出图,涵盖了等高线处理、GRD格网化、比例尺控制等关键步骤。通过实战技巧和案例分析,帮助地质工作者高效完成专业地质剖面图绘制,提升矿产勘探和工程勘察的工作效率。

weixin_28335283的博客 592

【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

C++/WinRT入门指南:现代Windows原生开发的核心技术

Windows运行时(WinRT)是微软为现代Windows应用开发设计的一套跨语言API框架,它基于COM技术原理构建,提供了统一的二进制接口标准。这项技术的核心价值在于让开发者能够以原生性能调用系统级功能,同时保持跨语言兼容性。在工程实践中,C++/WinRT作为官方推荐的C++语言投影,通过标准C++语法封装WinRT API,显著降低了开发复杂度。特别是在异步编程场景中,结合C++20协程特性,能够大幅提升代码可读性和维护性。对于需要高性能图形处理、系统集成或跨平台兼容的桌面应用开发,掌握C++/W

weixin_33910191的博客 1198

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

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

远方雪的专栏 1220

从VASP数据到LAMMPS模拟:手把手教你用DeePMD-kit搭建Cr-Si-Fe合金势函数

本文详细介绍了使用DeePMD-kit从VASP数据构建Cr-Si-Fe合金深度势能模型的全流程,包括数据准备、模型训练、优化及LAMMPS集成。通过实战教程,帮助研究者掌握DeePMD-kit训练技巧,实现高精度分子动力学模拟,提升材料计算效率。

weixin_33737134的博客 525

终于搞定!Cloudflare Tunnel 报错 Error 1033,一次完整修复记录

最近遇到了 Cloudflare Tunnel Error 1033 报错的问题,本文记录了完整的排查和解决方案💡

XiaoqiangClub的博客 1783

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

基于MATLAB的脑功能网络工具箱:BCT与FCLab

脑功能网络分析是神经科学领域的一个重要研究方向,它通过分析大脑中神经元之间的连接模式和信息传递方式,揭示脑网络的结构和功能。在这个领域,MATLAB是一个广泛使用的工具,提供了丰富的函数和工具箱来进行脑功能网络的分析和可视化。这些工具箱提供了丰富的函数和工具,使得脑功能网络的计算和分析变得更加简单和高效。在上述示例代码中,我们首先导入BCT工具箱,并构建一个邻接矩阵来表示脑网络的连接关系。在上述示例代码中,我们首先导入FCLab工具箱,并导入脑功能数据。函数对数据进行预处理,如去除噪声、降采样等操作。

web_bug407的博客 2611

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

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

weixin_36381252的博客 1647

微信小程序 - 详细实现打开跳转第三方 H5 网页链接,在微信小程序内直接跳转打开第三方网站链接详细教程(支持跳转公众号文章等,直接复制代码即可)

小程序跳转h5,小程序-Taro小程序中打开h5页面链接,...小程序跳转h5链接(web-view)_微信小程序,小程序如何跳转h5页面,小程序跳转到第三方H5网页,微信小程序跳转第三方H5的方法,小程序-实现怎么跳转打开H5网页链接(或跳转至公众号文章,打开第三方网站,放校验文件,怎么配置业务域名,校验文件验证域名,把校验文件放到对面网站,别人的服务器也打不开没权限怎么放呢,勾选不校验合法域名,txt,打不开别人的网页怎么办,真机调试打不开,无法跳转,有什么其他办法不放校验文件吗,后台配置,怎么

🏆 前端领域优质创作者 3万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

go调用python脚本_Golang调用Python

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

weixin_39746241的博客 436

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

2301_82244608的博客 755

Golang调用Python

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

m0_71327177的博客 3556

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_Golang调用Python-Go语言中文社区

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

weixin_39842519的博客 128

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基础入门
codehole_
博客等级 码龄7年 34粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值