Go调用Python by go-python3

2023-05-16

确保python版本为3.7

conda create go_python python=3.7
conda activate go_python 

确保python和go的架构一致

.mac中使用go的amd64版本也就是intel的x86
我的go_x86安装路径:/Users/gxy/sdk/go_x86_1.19
进入这个文件夹修改go执行文件名字,防止和本来的arm架构的go重名,并且提醒自己使用的go环境

cd go_x86_1.19/bin
mv go gox86

配置环境

vim ~/.bash_profile

在这里插入图片描述

source ~/.bash_profile

测试

  gox86 version

在这里插入图片描述

安装go-python3包

进入你的项目工程目录

export PKG_CONFIG_PATH=/Users/gxy/opt/anaconda3/envs/go_python/lib/pkgconfig
gox86 get github.com/datadog/go-python3 

调用自定义python

目录结构

在这里插入图片描述

测试的python文件 hello.py:

  a = 10
  def SayHello(xixi):
        return xixi + "haha"

go调用python的过程分为以下5步:

  1. 初始化python环境
  2. 引入模块py对象
  3. 使用该模块的变量与函数
  4. 解析结果
  5. 销毁python3运行环境

main.go:

 package main

  import (
      "fmt"
      "os"
      "github.com/datadog/go-python3"
  )

  func init() {
      // 1. 初始化python环境
      python3.Py_Initialize()
      if !python3.Py_IsInitialized() {
          fmt.Println("Error initializing the python interpreter")
          os.Exit(1)
      }
  }

  func main() {
      // 2. 设置本地python import 的路径
      p := "/Users/gxy/opt/anaconda3/envs/go_python/lib/python3.7/site-packages"
      InsertBeforeSysPath(p)
      // 3. 导入hello模块
      hello := ImportModule("./hello", "hello")
      // pyObject => string 解析结果
      helloRepr, err := pythonRepr(hello)
      if err != nil {
          panic(err)
      }
      fmt.Printf("[MODULE] repr(hello) = %s\n", helloRepr)
      // 4. 获取变量
      a := hello.GetAttrString("a")
      aString, err := pythonRepr(a)
      if err != nil {
          panic(err)
      }
      fmt.Printf("[VARS] a = %#v\n", aString)
      // 5. 获取函数方法
      SayHello := hello.GetAttrString("SayHello")
      // 设置调用的参数(一个元组)
      args := python3.PyTuple_New(1)                                        // 创建存储空间
      python3.PyTuple_SetItem(args, 0, python3.PyUnicode_FromString("gxy")) // 设置值
      res := SayHello.Call(args, python3.Py_None)                           // 调用
      fmt.Printf("[FUNC] res = %s\n", python3.PyUnicode_AsUTF8(res))
      // 6. 调用第三方库sklearn
      sklearn := hello.GetAttrString("sklearn")
      skVersion := sklearn.GetAttrString("__version__")
      sklearnRepr, err := pythonRepr(sklearn)
      if err != nil {
          panic(err)
      }
      skVersionRepr, err := pythonRepr(skVersion)
      if err != nil {
          panic(err)
      }
      fmt.Printf("[IMPORT] sklearn = %s\n", sklearnRepr)
      fmt.Printf("[IMPORT] sklearn version =  %s\n", skVersionRepr)
      // 7. 结束环境
      python3.Py_Finalize()
  }

  // InsertBeforeSysPath
  // @Description: 添加site-packages路径即包的查找路径
  // @param p
  func InsertBeforeSysPath(p string) {
      sysModule := python3.PyImport_ImportModule("sys")
      path := sysModule.GetAttrString("path")
      python3.PyList_Append(path, python3.PyUnicode_FromString(p))
  }

  // ImportModule
  // @Description: 倒入一个包
  // @param dir
  // @param name
  // @return *python3.PyObject
  func ImportModule(dir, name string) *python3.PyObject {
      sysModule := python3.PyImport_ImportModule("sys")                 // import sys
      path := sysModule.GetAttrString("path")                           // path = sys.path
      python3.PyList_Insert(path, 0, python3.PyUnicode_FromString(dir)) // path.insert(0, dir)
      return python3.PyImport_ImportModule(name)                        // return __import__(name)
  }

  // pythonRepr
  // @Description: PyObject转换为string
  // @param o
  // @return string
  // @return error
  func pythonRepr(o *python3.PyObject) (string, error) {
      if o == nil {
          return "", fmt.Errorf("object is nil")
      }
      s := o.Repr()
      if s == nil {
          python3.PyErr_Clear()
          return "", fmt.Errorf("failed to call Repr object method")
      }
      defer s.DecRef()

      return python3.PyUnicode_AsUTF8(s), nil
  }

  // PrintList
  // @Description: 输出一个List
  // @param list
  // @return error
  func PrintList(list *python3.PyObject) error {
      if exc := python3.PyErr_Occurred(); list == nil && exc != nil {
          return fmt.Errorf("Fail to create python list object")
      }
      defer list.DecRef()
      repr, err := pythonRepr(list)
      if err != nil {
          return fmt.Errorf("fail to get representation of object list")
      }
      fmt.Printf("python list: %s\n", repr)
      return nil
  }

进入main.go所在目录

 gox86 build main.go

设置一个@rpath即之前本地conda创建的库,否则会有路径问题

  install_name_tool -add_rpath /Users/gxy/opt/anaconda3/envs/go_python/lib ./main

运行可执行文件main,显示打印结果
在这里插入图片描述
结果是显示了,但报错,尝试更新golang.org/x/sys 扩展包,未果,暂未解决。

  fatal error:unexpected signal during runtime execution
  [signal SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0x4657ece]
  runtime stack:
  runtime.throw({0x40bd656?, 0x42bf000?})
          /Users/gxy/sdk/go_x86_1.19/src/runtime/panic.go:1047 +0x5d fp=0x20846d160 sp=0x20846d130 pc=0x40343dd
  runtime.sigpanic()
          /Users/gxy/sdk/go_x86_1.19/src/runtime/signal_unix.go:819 +0x369 fp=0x20846d1b0 sp=0x20846d160 pc=0x4048589
  goroutine 1 [syscall]:
  runtime.cgocall(0x40980f0, 0xc00005fe18)
          /Users/gxy/sdk/go_x86_1.19/src/runtime/cgocall.go:158 +0x5c fp=0xc00005fdf0 sp=0xc00005fdb8 pc=0x4005c5c
  github.com/datadog/go-python3._Cfunc_PyObject_GetAttrString(0x0, 0x4321120)
          _cgo_gotypes.go:4440 +0x4d fp=0xc00005fe18 sp=0xc00005fdf0 pc=0x4092c8d
  github.com/datadog/go-python3.(*PyObject).GetAttrString.func2(0x4321120?, 0xb?)
          /Users/gxy/go/go_projects/src/github.com/datadog/go-python3/object.go:84 +0x4c fp=0xc00005fe58 sp=0xc00005fe18 pc=0x4093a0c
  github.com/datadog/go-python3.(*PyObject).GetAttrString(0x40d7ed0?, {0x40b7b5e?, 0x40b8794?})
          /Users/gxy/go/go_projects/src/github.com/datadog/go-python3/object.go:84 +0x6a fp=0xc00005fea0 sp=0xc00005fe58 pc=0x409394a
  main.main()
          /Users/gxy/go/go_projects/src/main.go:47 +0x24b fp=0xc00005ff80 sp=0xc00005fea0 pc=0x409516b
  runtime.main()
          /Users/gxy/sdk/go_x86_1.19/src/runtime/proc.go:250 +0x212 fp=0xc00005ffe0 sp=0xc00005ff80 pc=0x4036bf2
  runtime.goexit()
          /Users/gxy/sdk/go_x86_1.19/src/runtime/asm_amd64.s:1594 +0x1 fp=0xc00005ffe8 sp=0xc00005ffe0 pc=0x4060681
  goroutine 2 [force gc (idle)]:
  runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
          /Users/gxy/sdk/go_x86_1.19/src/runtime/proc.go:363 +0xd6 fp=0xc00004cfb0 sp=0xc00004cf90 pc=0x4036fb6
  runtime.goparkunlock(...)
          /Users/gxy/sdk/go_x86_1.19/src/runtime/proc.go:369
  runtime.forcegchelper()
          /Users/gxy/sdk/go_x86_1.19/src/runtime/proc.go:302 +0xad fp=0xc00004cfe0 sp=0xc00004cfb0 pc=0x4036e4d
  runtime.goexit()
          /Users/gxy/sdk/go_x86_1.19/src/runtime/asm_amd64.s:1594 +0x1 fp=0xc00004cfe8 sp=0xc00004cfe0 pc=0x4060681
  created by runtime.init.6
          /Users/gxy/sdk/go_x86_1.19/src/runtime/proc.go:290 +0x25
  goroutine 3 [GC sweep wait]:
  runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
          /Users/gxy/sdk/go_x86_1.19/src/runtime/proc.go:363 +0xd6 fp=0xc00004d790 sp=0xc00004d770 pc=0x4036fb6
  runtime.goparkunlock(...)
          /Users/gxy/sdk/go_x86_1.19/src/runtime/proc.go:369
  runtime.bgsweep(0x0?)
          /Users/gxy/sdk/go_x86_1.19/src/runtime/mgcsweep.go:278 +0x8e fp=0xc00004d7c8 sp=0xc00004d790 pc=0x402494e
  runtime.gcenable.func1()
          /Users/gxy/sdk/go_x86_1.19/src/runtime/mgc.go:178 +0x26 fp=0xc00004d7e0 sp=0xc00004d7c8 pc=0x4019806
  runtime.goexit()
          /Users/gxy/sdk/go_x86_1.19/src/runtime/asm_amd64.s:1594 +0x1 fp=0xc00004d7e8 sp=0xc00004d7e0 pc=0x4060681
  created by runtime.gcenable
          /Users/gxy/sdk/go_x86_1.19/src/runtime/mgc.go:178 +0x6b
  goroutine 4 [GC scavenge wait]:
  runtime.gopark(0xc0000280e0?, 0x40d7948?, 0x1?, 0x0?, 0x0?)
          /Users/gxy/sdk/go_x86_1.19/src/runtime/proc.go:363 +0xd6 fp=0xc00004df70 sp=0xc00004df50 pc=0x4036fb6
  runtime.goparkunlock(...)
          /Users/gxy/sdk/go_x86_1.19/src/runtime/proc.go:369
  runtime.(*scavengerState).park(0x4155440)
          /Users/gxy/sdk/go_x86_1.19/src/runtime/mgcscavenge.go:389 +0x53 fp=0xc00004dfa0 sp=0xc00004df70 pc=0x40229f3
  runtime.bgscavenge(0x0?)
          /Users/gxy/sdk/go_x86_1.19/src/runtime/mgcscavenge.go:617 +0x45 fp=0xc00004dfc8 sp=0xc00004dfa0 pc=0x4022fc5
  runtime.gcenable.func2()
          /Users/gxy/sdk/go_x86_1.19/src/runtime/mgc.go:179 +0x26 fp=0xc00004dfe0 sp=0xc00004dfc8 pc=0x40197a6
  runtime.goexit()
          /Users/gxy/sdk/go_x86_1.19/src/runtime/asm_amd64.s:1594 +0x1 fp=0xc00004dfe8 sp=0xc00004dfe0 pc=0x4060681
  created by runtime.gcenable
          /Users/gxy/sdk/go_x86_1.19/src/runtime/mgc.go:179 +0xaa
  goroutine 5 [finalizer wait]:
  runtime.gopark(0x4155840?, 0xc000007860?, 0x0?, 0x0?, 0xc00004c770?)
          /Users/gxy/sdk/go_x86_1.19/src/runtime/proc.go:363 +0xd6 fp=0xc00004c628 sp=0xc00004c608 pc=0x4036fb6
  runtime.goparkunlock(...)
          /Users/gxy/sdk/go_x86_1.19/src/runtime/proc.go:369
  runtime.runfinq()
          /Users/gxy/sdk/go_x86_1.19/src/runtime/mfinal.go:180 +0x10f fp=0xc00004c7e0 sp=0xc00004c628 pc=0x401890f
  runtime.goexit()
          /Users/gxy/sdk/go_x86_1.19/src/runtime/asm_amd64.s:1594 +0x1 fp=0xc00004c7e8 sp=0xc00004c7e0 pc=0x4060681
  created by runtime.createfing
          /Users/gxy/sdk/go_x86_1.19/src/runtime/mfinal.go:157 +0x45
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go调用Python by go-python3 的相关文章

  • 用于将 cython 中的许多 C++ 类包装到单个共享对象的项目结构

    我在文档 邮件列表和这个问题在这里 https stackoverflow com questions 10300660 cython and distutils 但我想得到一个更直接的答案来解决我的具体情况 我正在通过尝试一点一点地包装我
  • 无法“安装”plpython3u - postgresql

    我正在尝试在 postgresql 中使用 python 语言 像这样的事情 create or replace function test a integer returns integer as if a 2 0 return even
  • Python 中的 Lanczos 插值与 2D 图像

    我尝试重新缩放 2D 图像 灰度 图像大小为 256x256 所需输出为 224x224 像素值范围从 0 到 1300 我尝试了两种使用 Lanczos 插值来重新调整它们的方法 首先使用PIL图像 import numpy as np
  • Django 管理员在模型编辑时间歇性返回 404

    我们使用 Django Admin 来维护导出到我们的一些站点的一些数据 有时 当单击标准更改列表视图来获取模型编辑表单而不是路由到正确的页面时 我们会得到 Django 404 页面 模板 它是偶尔发生的 我们可以通过重新加载三次来重现它
  • 将数据从 python pandas 数据框导出或写入 MS Access 表

    我正在尝试将数据从 python pandas 数据框导出到现有的 MS Access 表 我想用已更新的数据替换 MS Access 表 在 python 中 我尝试使用 pandas to sql 但收到错误消息 我觉得很奇怪 使用 p
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • SQLALchemy .query:类“Car”的未解析属性引用“query”

    我有一个这里已经提到的问题https youtrack jetbrains com issue PY 44557 https youtrack jetbrains com issue PY 44557 但我还没有找到解决方案 我使用 Pyt
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • AWS EMR Spark Python 日志记录

    我正在 AWS EMR 上运行一个非常简单的 Spark 作业 但似乎无法从我的脚本中获取任何日志输出 我尝试过打印到 stderr from pyspark import SparkContext import sys if name m
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • Python:如何将列表列表的元素转换为无向图?

    我有一个程序 可以检索 PubMed 出版物列表 并希望构建一个共同作者图 这意味着对于每篇文章 我想将每个作者 如果尚未存在 添加为顶点 并添加无向边 或增加每个合著者之间的权重 我设法编写了第一个程序 该程序检索每个出版物的作者列表 并
  • 如何计算 pandas 数据帧上的连续有序值

    我试图从给定的数据帧中获取连续 0 值的最大计数 其中包含来自 pandas 数据帧的 id date value 列 如下所示 id date value 354 2019 03 01 0 354 2019 03 02 0 354 201
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip

随机推荐

  • 推荐10款简单好用的免费内网穿透工具

    前言 远程办公越来越普遍 xff0c 但是如何应对在外远程桌面控制公司电脑 远程公司内网办公系统 调阅公司文件资料 远程公司内网服务器是个问题 而解决方案其实很简单 xff0c 做内网穿透就可以突破局域网的限制 xff0c 轻松实现公网访问
  • Java支付宝沙箱环境支付,官方Demo远程调试【内网穿透】

    文章目录 1 下载当面付demo2 修改配置文件3 打包成web服务4 局域网测试5 内网穿透6 测试公网访问7 配置二级子域名8 测试使用固定二级子域名访问 在沙箱环境调试支付SDK的时候 xff0c 往往沙箱环境部署在本地 xff0c
  • opencv内存不足问题(OpenCV Error: Insufficient memory)

    最近在用opencv自带的函数haartraining训练分类器 xff0c 之前用的图片是20 20 xff0c 能训练出分类器 xff0c 后来换成了80 86 xff0c 就报错了 xff0c 报的错误是内存不足 xff0c 于是 x
  • ffmpeg 4.2.2 实现mp4转avi(修改官方remuxing例子)

    最近想把ffmpeg官方例子过一遍 xff0c 达到初步了解ffmpeg的目的 xff0c 本文只是给自己一个记录 xff0c 也是在网上没有找到一样的文章 xff0c 发出来供大家指点 直接使用官方demo xff0c 把mp4转换成av
  • 12.bss段的初始化

    12 bss段的初始化 在C代码 xff1a 有初始化全局的数据段 xff0c 局部的栈 xff0c malloc部分的堆 xff0c 未初始化的全局的bss段 从上面的编译的信息知道 xff1a Bss段的起始地址 xff1a 00010
  • pandas学习之df.rename()

    pandas学习之df rename df rename 用于更改行列的标签 xff0c 即行列的索引 可以传入一个字典或者一个函数 在数据预处理中 xff0c 比较常用 官方文档 xff1a DataFrame rename self m
  • java8操作两个集合List

    public static void main String args List lt String gt list1 61 new ArrayList lt String gt list1 add 34 1 34 list1 add 34
  • Atcoder AGC005 题解

    A STring 用类似括号匹配的方法搞一下即可 span class token macro property span class token directive keyword include span span class toke
  • CentOS-7安装桌面环境

    CentOS 7安装桌面环境 CentOS 7安装桌面环境 CentOS 7安装Server with GUI 设置为开机从桌面环境启动 yum y group install 39 Server with GUI 39 systemctl
  • [软件注册]Sublime 3 激活/注册码(key)

    偶然发现了一种sublime激活方式 使用的sublime3 1 1版本 亲试有效 Step1 配置 host文件 推荐使用 switchhost软件 可以快速变更host span class hljs number 127 0 span
  • 测试git能否连接github

    welcome to my blog 使用以下命令进行测试 ssh T git 64 github com 出现报错 ssh dispatch run fatal Connection to 13 250 177 223 port 22 S
  • vtk中实现3D模型(读取文件)

    xff08 xff09 VTK 坐标系统及空间变换 窗口 视图分割 mb5fed73533dfa9的技术博客 51CTO博客 VTK学习 xff08 三 xff09 VTK读取序列图像 灰信网 xff08 软件开发博客聚合 xff09 读取
  • centos中安装Python2.7

    转载于 xff1a 秋水逸冰 CentOS 6 8安装Python2 7 13 查看当前系统中的 Python 版本 python version 返回 Python 2 6 6 为正常 检查 CentOS 版本 cat etc redha
  • 安装tar.gz文件(无configure文件)

    如何安装tar gz文件 xff08 以webstorm为例 xff09 1 获取root权限并输入密码 xff1a su root 2 进入有该文件的目录下 xff08 以我的为例 xff0c 具体看你的文件在哪里 xff09 cd 下载
  • 游戏服务端框架之业务线程模型

    请求消息绑定线程策略的选择 在上一篇文章中 我们看到 消息是直接在网络框架的io线程中处理的 这样做有一个非常严重的缺陷 如果业务处理比较耗时 那么io线程接受消息的速度就会下降 严重影响io的吞吐量 典型的 我们应该另起线程池 专门用于异
  • 在WSL中使用GPU:WSL2 + Ubuntu 18.04 + CUDA + Gnome图形界面环境配置

    目录 引言1 确认Windows 10版本2 在Windows上安装WSL23 在Windows上安装CUDA on WSL驱动4 在WSL2中安装CUDA Toolkit3 测试CUDA是否能在WSL2中运作4 安装Gnome图形界面其他
  • Centos 开启路由转发实现全网互通

    只需在RouterSrv网关服务器上开启路由转发功能即可 root 64 RouterSrv vi etc sysctl conf net ipv4 ip forward 61 1 添加此行即可 root 64 localhost sysc
  • 虚拟机中配置外网环境

    文章目录 在虚拟机中配置外网环境 在虚拟机中配置外网环境 主机为 win10 xff0c 虚拟机中为 ubuntu 系统 xff0c 采用clash 1 xff0c 设置 Allow Lan xff0c 允许局域网访问 2 xff0c 虚拟
  • mysql 操作数据库(备份与恢复)

    一 直接把创建数据库的语句放到sql 文件中 xff1a php 写法 xff1a lt php mysql port 61 get mysql port cmd 61 US MYSQL BIN 34 mysql exe port 61 3
  • Go调用Python by go-python3

    确保python版本为3 7 conda create go python span class token assign left variable python span span class token operator 61 spa