确保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 = 10def SayHello(xixi):return xixi + "haha"

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

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

main.go:

 package mainimport ("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. 调用第三方库sklearnsklearn := 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 pfunc 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.PyObjectfunc ImportModule(dir, name string) *python3.PyObject {sysModule := python3.PyImport_ImportModule("sys")                 // import syspath := sysModule.GetAttrString("path")                           // path = sys.pathpython3.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 errorfunc 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 errorfunc 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=0x40343ddruntime.sigpanic()/Users/gxy/sdk/go_x86_1.19/src/runtime/signal_unix.go:819 +0x369 fp=0x20846d1b0 sp=0x20846d160 pc=0x4048589goroutine 1 [syscall]:runtime.cgocall(0x40980f0, 0xc00005fe18)/Users/gxy/sdk/go_x86_1.19/src/runtime/cgocall.go:158 +0x5c fp=0xc00005fdf0 sp=0xc00005fdb8 pc=0x4005c5cgithub.com/datadog/go-python3._Cfunc_PyObject_GetAttrString(0x0, 0x4321120)_cgo_gotypes.go:4440 +0x4d fp=0xc00005fe18 sp=0xc00005fdf0 pc=0x4092c8dgithub.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=0x4093a0cgithub.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=0x409394amain.main()/Users/gxy/go/go_projects/src/main.go:47 +0x24b fp=0xc00005ff80 sp=0xc00005fea0 pc=0x409516bruntime.main()/Users/gxy/sdk/go_x86_1.19/src/runtime/proc.go:250 +0x212 fp=0xc00005ffe0 sp=0xc00005ff80 pc=0x4036bf2runtime.goexit()/Users/gxy/sdk/go_x86_1.19/src/runtime/asm_amd64.s:1594 +0x1 fp=0xc00005ffe8 sp=0xc00005ffe0 pc=0x4060681goroutine 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=0x4036fb6runtime.goparkunlock(...)/Users/gxy/sdk/go_x86_1.19/src/runtime/proc.go:369runtime.forcegchelper()/Users/gxy/sdk/go_x86_1.19/src/runtime/proc.go:302 +0xad fp=0xc00004cfe0 sp=0xc00004cfb0 pc=0x4036e4druntime.goexit()/Users/gxy/sdk/go_x86_1.19/src/runtime/asm_amd64.s:1594 +0x1 fp=0xc00004cfe8 sp=0xc00004cfe0 pc=0x4060681created by runtime.init.6/Users/gxy/sdk/go_x86_1.19/src/runtime/proc.go:290 +0x25goroutine 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=0x4036fb6runtime.goparkunlock(...)/Users/gxy/sdk/go_x86_1.19/src/runtime/proc.go:369runtime.bgsweep(0x0?)/Users/gxy/sdk/go_x86_1.19/src/runtime/mgcsweep.go:278 +0x8e fp=0xc00004d7c8 sp=0xc00004d790 pc=0x402494eruntime.gcenable.func1()/Users/gxy/sdk/go_x86_1.19/src/runtime/mgc.go:178 +0x26 fp=0xc00004d7e0 sp=0xc00004d7c8 pc=0x4019806runtime.goexit()/Users/gxy/sdk/go_x86_1.19/src/runtime/asm_amd64.s:1594 +0x1 fp=0xc00004d7e8 sp=0xc00004d7e0 pc=0x4060681created by runtime.gcenable/Users/gxy/sdk/go_x86_1.19/src/runtime/mgc.go:178 +0x6bgoroutine 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=0x4036fb6runtime.goparkunlock(...)/Users/gxy/sdk/go_x86_1.19/src/runtime/proc.go:369runtime.(*scavengerState).park(0x4155440)/Users/gxy/sdk/go_x86_1.19/src/runtime/mgcscavenge.go:389 +0x53 fp=0xc00004dfa0 sp=0xc00004df70 pc=0x40229f3runtime.bgscavenge(0x0?)/Users/gxy/sdk/go_x86_1.19/src/runtime/mgcscavenge.go:617 +0x45 fp=0xc00004dfc8 sp=0xc00004dfa0 pc=0x4022fc5runtime.gcenable.func2()/Users/gxy/sdk/go_x86_1.19/src/runtime/mgc.go:179 +0x26 fp=0xc00004dfe0 sp=0xc00004dfc8 pc=0x40197a6runtime.goexit()/Users/gxy/sdk/go_x86_1.19/src/runtime/asm_amd64.s:1594 +0x1 fp=0xc00004dfe8 sp=0xc00004dfe0 pc=0x4060681created by runtime.gcenable/Users/gxy/sdk/go_x86_1.19/src/runtime/mgc.go:179 +0xaagoroutine 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=0x4036fb6runtime.goparkunlock(...)/Users/gxy/sdk/go_x86_1.19/src/runtime/proc.go:369runtime.runfinq()/Users/gxy/sdk/go_x86_1.19/src/runtime/mfinal.go:180 +0x10f fp=0xc00004c7e0 sp=0xc00004c628 pc=0x401890fruntime.goexit()/Users/gxy/sdk/go_x86_1.19/src/runtime/asm_amd64.s:1594 +0x1 fp=0xc00004c7e8 sp=0xc00004c7e0 pc=0x4060681created by runtime.createfing/Users/gxy/sdk/go_x86_1.19/src/runtime/mfinal.go:157 +0x45

Go调用Python by go-python3相关推荐

  1. linux python qt 安装目录,Linux 下QT调用Python库文件 以及Linux 安装Python3.8开发环境 问题...

    最近想运用linux系统下Qt来实现c++ 与python的混合编程,linux系统会自带python2.7版本或者python3.5版本(深度linux). Qt调用python文件需要在pro文件 ...

  2. c++Error:c++调用python文件提示由于找不到python3.8.dll,无法继续运行。。。

    [写在前面] 今天在做C++调用python文件时发程序运行报错提示: "由于找不到python3.8.dll,无法继续运行..." [原因描述] 系统中缺少python3.8.d ...

  3. 【Qt】Qt中调用python接口

    在Qt程序中调用python函数从步骤 1.在pro中添加python的头文件路径和库 INCLUDEPATH += /usr/include/python3.4 LIBS += -L /usr/li ...

  4. C++调用Python实例

    C++调用Python方法基本有以下几个步骤: 1.下载Python,单独下载和conda安装的都可以 2.配置信息(本次我用的配置是VS2013+Python36),注意Python请下载32位的版 ...

  5. excel调用python编程-用Python如何开发Excel宏脚本?新手必学

    今天介绍一个叫 xlpython 的库,通过它我们可以用 Python 来开发 Excel 的宏脚本,真正实现在 Excel 中调用 Python. 基本环境 操作系统:Windows 10 x64 ...

  6. php python-浅谈php调用python文件

    关于PHP调用Python数据传输问题 这是以前大学时做项目出现的问题,现在把它挪上来,希望给遇到问题的未来大佬给出一些小的思路,请大佬们不要大意的帮我改正,如果出现问题或者有更好的解决方法,希望大家 ...

  7. python语言视频-Python语言之Python3 实现简易局域网视频聊天工具

    本文主要向大家介绍了Python语言之Python3 实现简易局域网视频聊天工具,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 操作系统为 Ubuntu 16.04,OpenCV ...

  8. vim调用python显示json数据

    在vim查看json格式文件的时候,为了提高阅读性,可以调用python工具实现json格式, python有个标准模块叫json,用于编码/解码,序列化/按序列化json格式数据. 可以使用vim调 ...

  9. 如何在C++中调用python程序?

    文章目录 1. Embedding Python in Another Application 将Python嵌入另一个应用程序中 1.1. Very High Level Embedding 高层嵌 ...

  10. java代码调用python_Java调用Python

    常见的java调用python脚本方式有两种,下面给大家介绍一下: 通过Jython.jar提供的类库实现 通过Runtime.getRuntime()开启进程来执行脚本文件 这两种方法我都尝试过,个 ...

最新文章

  1. Error in x$e : $ operator is invalid for atomic vectors
  2. matlab中rowset什么意思,没什么用的matlab代码1
  3. 最大功率点跟踪测试软件,最大功率点跟踪
  4. 如何去掉ECShop 2.7.2中的Powered by ECShop字符
  5. [react] 在使用react过程中什么时候用HOC?
  6. win10 查看文件扩展名 - 教程篇
  7. layui table 时间戳
  8. ief12执行一次js才有效_陈列到底多久调一次才有效?
  9. java代码继承------多层继承
  10. silverlight将字符串转化为控件
  11. 【摩尔吧今日推荐】我们一定要给自己提出这样的任务:第一,学习,第二是学习,第三还是学习。
  12. go语言的字符串长度
  13. 从零开始学习CANoe(二)—— CANdb++ 创建 dbc文件
  14. 英雄联盟查服务器角色信息,LOL英雄联盟角色信息查询
  15. 关于SQL server 2012无法打开物理文件“某某某”,操作系统错误5 :(拒绝访问)。(Microsoft SQL Server,错误 5120)
  16. 苹果硬改技术好在哪里?
  17. 西北工业大学计算机学院推免,2021年西北工业大学接收推荐免试研究生预报名的通知...
  18. 罗马神话缪斯_缪斯与边缘– Adob​​e Web Designer的工具
  19. A_A02_004 J-LINK驱动安装
  20. BLE错误码全面解析连接失败原因错误码解析BLE Disconnect Reason

热门文章

  1. 12、PIC系列-I2C通讯模块
  2. Vue定时器设置 Vue简单定时任务
  3. effective java之 builder模式
  4. 上传文件时,文件名中文乱码
  5. 【数据分析干货】全网最全!各行业常见的业务指标整理(四)-财务指标
  6. Delphi XE6 原生解析json
  7. 阿里亮相 SIGCOMM2017 调度系统NetO惊艳全场
  8. 三分钟看懂大数据风控中用户行为数据的采集、分析及应用( 转 )
  9. Jfrog 搭建本地maven仓库以及上传Android库
  10. 丝毫不懂代码——gluoncv库进行语义分割(python)