go调用python

2023-05-16

安装

  1. 安装python和go的环境,
  2. 在debian和ubuntu系统上,还要sudo apt install python-all-dev
  3. 安装sudo apt-get install pkg-config
  4. 安装go get github.com/sbinet/go-python
  5. 测试

根据这个教程测试了以下,发现可以得到相同的结果(根据教程我写的文件放在后面test.go)
https://www.jianshu.com/p/a49047a474e5

注意一点,就是导入当前目录,教程使用的是空字符串"", 我测试以后发现不行,就使用了绝对路径"/home/zhang/桌面/go-python",如果不导入python文件所在目录,是找不到python文件的。

如果这个教程里面的全部能测试成功,那么go调用python基本没有问题了

python绘图

想要在python中实现傅里叶变换,然后把结果绘图表示出来,需要安装对应的python库。

首先,需要依次安装numpy,scipy,matplotlib这三个库

为了在终端能够绘制显示出结果的图像,还需要安装两个软件:

  1. tk开发包: sudo apt-get install tk-dev
  2. Python的tk模块:sudo apt-get install python-tk

然后就可以测试了。

首先测试直接运行python代码能否成功fft并绘图:

编写好代码fft2.go(代码在最后),然后输入:

python fft2.go

成功绘图:
"/home/zhang/桌面/go-python/fft"

下面测试用go调用python的fft函数

需要改写fft2.py,改写后的代码放在最后(fft.py)。编写main.go,在其中导入fft.py所在目录,然后就可以调用fft.py了(main.go放在最后)
运行,可以输出结果:
在这里插入图片描述

使用笔记

下面是关于go-python这个包的使用笔记

go导包:m= python.PyImport_ImportModule("fib")
有了包以后就可以调用里面的函数,访问变量
访问变量: path:= m.GetAttrString("path")//访问b包中名叫path的变量,事实上返回的是一个python-list
获取python-list中的一个元素 item := python.PyList_GET_ITEM(path,i)//返回一个python-string
python-string转为string s:=python.PyString_AsString(item)

访问函数:fib:= m.GetAttrString("fib")//根据函数名,返回python-function
调用函数: out:=fib.CallFunction(python.PyInt_FromLong(10))//返回python-int
pyint转为int:python.PyInt_AsLong(out)

test.go

package main
import (
	"fmt"
	"github.com/sbinet/go-python"
	"os"
)
func init(){
	err:= python.Initialize()
	if err!=nil{
		panic(err.Error())
	}
}
func main1(){
	rc := python.Py_Main(os.Args)
	os.Exit(rc)
	//go run main.go --version
	//2.7.17
}
func main2(){
	m:= python.PyImport_ImportModule("sys")
	if m == nil{
		fmt.Println("import error")
	}
	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)
	}
//打印path
	///usr/lib/python2.7
	///usr/lib/python2.7/plat-x86_64-linux-gnu
	///usr/lib/python2.7/lib-tk
	///usr/lib/python2.7/lib-old
	///usr/lib/python2.7/lib-dynload
	///home/zhang/.local/lib/python2.7/site-packages
	///usr/local/lib/python2.7/dist-packages
	///usr/lib/python2.7/dist-packages
}
func main(){
	m:= python.PyImport_ImportModule("sys")
	if m == nil{
		fmt.Println("import error")
	}
	path:= m.GetAttrString("path")
	if path ==nil{
		fmt.Println("get path error")
		return
	}
//python文件存放的路径
	curdir:=python.PyString_FromString("/home/zhang/桌面/go-python/set_path")
	err:=python.PyList_Insert(path,0,curdir)

	if err!=nil{
		print(err)
	}
	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)
	}

	m= python.PyImport_ImportModule("fib")
	if m == nil{
		fmt.Println("import fib 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)
	}

	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))

}

fft2.py

# _*_ coding: utf-8 _*_	
import numpy as np
from scipy.fftpack import fft,ifft
import matplotlib.pyplot as plt



#采样点选择1400个,因为设置的信号频率分量最高为600赫兹,根据采样定理知采样频率要大于信号频率2倍,所以这里设置采样频率为1400赫兹(即一秒内有1400个采样点,一样意思的)
def fft_func():
    x=np.linspace(0,1,1400)

    #设置需要采样的信号,频率分量有180390600
    y=7*np.sin(2*np.pi*180*x) + 2.8*np.sin(2*np.pi*390*x)+5.1*np.sin(2*np.pi*600*x)

    yy=fft(y)      #快速傅里叶变换
    yreal = yy.real    # 获取实数部分
    yimag = yy.imag    # 获取虚数部分

    yf=abs(fft(y))    # 取绝对值
    yf1=abs(fft(y))/len(x)   #归一化处理
    yf2 = yf1[range(int(len(x)/2))] #由于对称性,只取一半区间

    xf = np.arange(len(y))  # 频率
    xf1 = xf
    xf2 = xf[range(int(len(x)/2))] #取一半区间


    plt.subplot(221)
    plt.plot(x[0:50],y[0:50])
    plt.title('Original wave')

    plt.subplot(222)
    plt.plot(xf,yf,'r')
    plt.title('FFT of Mixed wave(two sides frequency range)',fontsize=7,color='#7A378B') #注意这里的颜色可以查询颜色代码表

    plt.subplot(223)
    plt.plot(xf1,yf1,'g')
    plt.title('FFT of Mixed wave(normalization)',fontsize=9,color='r')

    plt.subplot(224)
    plt.plot(xf2,yf2,'b')
    plt.title('FFT of Mixed wave)',fontsize=10,color='#F08080')


    plt.show()
fft_func()


fft.py:

# _*_ coding: utf-8 _*_	
import numpy as np
from scipy.fftpack import fft,ifft
import matplotlib.pyplot as plt
import json
def fft_func(data):

    z=json.loads(data)

    y=np.array(z)

    yf1=abs(fft(y))/len(z)   #归一化处理

    yf2 = yf1[range(int(len(z)/2))] #由于对称性,只取一半区间

    yA = yf2.tolist()

    return str(yA)# 返回float的 list


main.go


package main

import (
	"encoding/json"
	"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")
	}
	path:= m.GetAttrString("path")

	if path ==nil{
		fmt.Println("get path error")
		return
	}
	//python文件存放的路径
	curdir:=python.PyString_FromString("/home/zhang/桌面/go-python/fft")
	python.PyList_Insert(path,0,curdir)

	//和获取包
	m=python.PyImport_ImportModule("fft")

	if m ==nil{
		fmt.Println("import err")
	}


	fft_func := m.GetAttrString("fft_func")


	if fft_func==nil{
		fmt.Println("get fft_func error")
		return
	}
	raw:=[]int{1,1,1,1,1,1,1,1}
	//raw:=[]float64{1.0,1.0,2.3}
	//raw :=make(map[string][]int)
	//raw["data"]=[]int{1,2,3}
	byt,_:=json.Marshal(raw)
	str :=  string(byt)

	res := fft_func.CallFunction(python.PyString_FromString(str))
	if res ==nil{
		fmt.Println("call fft_func error")
		return
	}
	s:=python.PyString_AS_STRING(res)
	print(s)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go调用python 的相关文章

随机推荐

  • asp不能正常用的原因

    前几天做网站时 xff0c 机子出现了这种症状 xff0c 重装过IE和IIS一样也无法解决 xff0c 在百度里找了一下 xff0c 下面的方法真的很适用 症状 xff1a 运行asp程序 包括其他动态网页程序 出现500内部错误信息 x
  • 用DLL实现把数据库的记录导出到EXCEL中(VB)

    39 新建一个ActiveX DLL工程工程名为DbToExcel 39 工程 gt 引用 引用Microsoft ActiveX Data Objects 2 6 Library 39 Microsoft Excel 9 0 Object
  • MySQL转换为SqlServer数据库

    如何将MySQL数据导入到SqlServer中 xff0c 请看以下步骤 xff1a 1 安装mysql数据库的ODBC驱动 xff0c mysql connector odbc 3 51 19 win32 msi 2 打开控制面板管理工具
  • DataTimePicker数据绑定遇到Null时异常的原因

    DateTimePicker1 DataBindings Add 34 Value 34 bindingSource1 34 assessortime 34 如果字段 assessortime的值 为 null 时 就会出现异常 后来发现
  • c#中DataTable与实体集合相互转换

    以下是将集合类转换成DataTable lt summary gt 将集合类转换成DataTable lt summary gt lt param name 61 34 list 34 gt 集合 lt param gt lt return
  • 用Linux命令行生成随机密码的十种方法

    转载自 极客范 xff0c 不得不夸夸强大的Bash啊 xff01 xff01 xff01 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • C++20 Ranges

    VS2019 C 43 43 20的Ranges 01 引入范围的动机02 范围 ranges 03 range v3库04 C 43 43 20 range demo 01 引入范围的动机 C 43 43 17以前的标准库中大多数通用算法
  • 面向对象分析设计步骤

    一 创建用例 初步确定用例 xff1a 1 确定参与者 2 确定用例 xff08 系统操作 xff09 3 确定参与者与用例之间的关系 用例细节描述 xff1a 1 用例名称 2 操作详细描述 3 前置条件描述 4 部署约束 5 正常事件流
  • collect2: ld terminated with signal 9 错误解决办法

    编译android是出现如下错误 xff1a target Java CameraEffectsTests out target common obj APPS CameraEffectsTests intermediates classe
  • 浅谈Stein算法求最大公约数(GCD)的原理及简单应用

    一 Stein算法过程及其简单证明 1 一般步骤 xff1a s1 当两数均为偶数时将其同时除以2至至少一数为奇数为止 xff0c 记录除掉的所有公因数2的乘积k xff1b s2 如果仍有一数为偶数 xff0c 连续除以2直至该数为奇数为
  • 【已解决】@Configration爆红

    64 Configration爆红 问题原因 xff1a 一 xff1a 没有添加依赖 二 xff1a 添加依赖了 xff0c 但是依赖版本过低 解决方法 xff1a 把依赖的版本改的高一点 span class token generic
  • 关于冒泡排序的程序( 第三次作业)

    此前想过把两种排序方式都一起写在一个工程文件里 xff0c 但做了下 xff0c 能力有限 xff0c 没法写完整 xff0c 所以就只能分别写 xff0c 这个是冒泡排序 xff0c 代码已尽量做到准确的注释 xff0c 希望提醒自己往后
  • BSS段

    深入理解计算机系统 bss段 xff0c data段 text段 堆 heap 和栈 stack 1 关于BSS段的大小 2 1 BSS段中的内容 2 2 BSS段在加载运行前的处理 3 3 BSS段的作用 3 4 代码优化对BSS段的影响
  • Java 比较两个List对象差集(根据某一值)

    很多都是比较List lt String gt 的 xff0c 和自身业务不符 xff0c jdk1 8 新特性强大的Stream API xff0c 具体是什么方法 xff0c 什么作用自行百度 xff0c 复制粘贴可以解决问题就OK 4
  • Windows10 安装Redis(图文教程)

    Redis xff08 Remote Dictionary Server xff0c 即远程字典服务 xff0c 是一个开源的使用ANSI C语言编写 支持网络 可基于内存亦可持久化的日志型 Key Value数据库 一 下载redis客户
  • e17 enlightenment 介绍及配置

    为什么要有一个窗口管理器 为什么一定要有一个桌面背景 xff0c 甚至是标题栏 或是如果把一个应用程序如firefox当成桌面背景行不行 桌面能不能再快一点 我不想把资源浪费在那些用不到的地方 Linux那么多虚拟桌面 xff0c 为什么我
  • Vim: Warning: input is not from a terminal 后退出 vim 终端异常

    Vim Warning input is not from a terminal 后退出 vim 终端异常 今天执行了如下命令调用 vi 来打开 find 搜索到的文件 xff1a longyu 64 longyu pc span clas
  • UNPV2 学习:Posix Message Queues

    文章目录 特点消息队列的释放mq notify 函数mq notify 使用信号通知消息到达直接在信号处理函数中调用 mq notify 与 mq receive 函数来接收数据在信号处理函数中设置标志在程序主逻辑中调用 mq notify
  • VMware ESXI虚拟机磁盘在线扩容后fdisk -l 找不到问题解决

    VMware ESXI虚拟机磁盘在线扩容后fdisk l 找不到问题解决 在VMware ESXI终端页面为虚拟机新增磁盘后 xff0c 进入虚拟机执行fdisk l 找不到新增的盘 重启系统肯定是可以解决的 xff0c 但是机器有在跑测试
  • go调用python

    安装 安装python和go的环境 xff0c 在debian和ubuntu系统上 xff0c 还要sudo apt install python all dev安装sudo apt get install pkg config安装go g