Go调用Python by go-python3
确保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步:
- 初始化python环境
- 引入模块py对象
- 使用该模块的变量与函数
- 解析结果
- 销毁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相关推荐
- linux python qt 安装目录,Linux 下QT调用Python库文件 以及Linux 安装Python3.8开发环境 问题...
最近想运用linux系统下Qt来实现c++ 与python的混合编程,linux系统会自带python2.7版本或者python3.5版本(深度linux). Qt调用python文件需要在pro文件 ...
- c++Error:c++调用python文件提示由于找不到python3.8.dll,无法继续运行。。。
[写在前面] 今天在做C++调用python文件时发程序运行报错提示: "由于找不到python3.8.dll,无法继续运行..." [原因描述] 系统中缺少python3.8.d ...
- 【Qt】Qt中调用python接口
在Qt程序中调用python函数从步骤 1.在pro中添加python的头文件路径和库 INCLUDEPATH += /usr/include/python3.4 LIBS += -L /usr/li ...
- C++调用Python实例
C++调用Python方法基本有以下几个步骤: 1.下载Python,单独下载和conda安装的都可以 2.配置信息(本次我用的配置是VS2013+Python36),注意Python请下载32位的版 ...
- excel调用python编程-用Python如何开发Excel宏脚本?新手必学
今天介绍一个叫 xlpython 的库,通过它我们可以用 Python 来开发 Excel 的宏脚本,真正实现在 Excel 中调用 Python. 基本环境 操作系统:Windows 10 x64 ...
- php python-浅谈php调用python文件
关于PHP调用Python数据传输问题 这是以前大学时做项目出现的问题,现在把它挪上来,希望给遇到问题的未来大佬给出一些小的思路,请大佬们不要大意的帮我改正,如果出现问题或者有更好的解决方法,希望大家 ...
- python语言视频-Python语言之Python3 实现简易局域网视频聊天工具
本文主要向大家介绍了Python语言之Python3 实现简易局域网视频聊天工具,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 操作系统为 Ubuntu 16.04,OpenCV ...
- vim调用python显示json数据
在vim查看json格式文件的时候,为了提高阅读性,可以调用python工具实现json格式, python有个标准模块叫json,用于编码/解码,序列化/按序列化json格式数据. 可以使用vim调 ...
- 如何在C++中调用python程序?
文章目录 1. Embedding Python in Another Application 将Python嵌入另一个应用程序中 1.1. Very High Level Embedding 高层嵌 ...
- java代码调用python_Java调用Python
常见的java调用python脚本方式有两种,下面给大家介绍一下: 通过Jython.jar提供的类库实现 通过Runtime.getRuntime()开启进程来执行脚本文件 这两种方法我都尝试过,个 ...
最新文章
- Error in x$e : $ operator is invalid for atomic vectors
- matlab中rowset什么意思,没什么用的matlab代码1
- 最大功率点跟踪测试软件,最大功率点跟踪
- 如何去掉ECShop 2.7.2中的Powered by ECShop字符
- [react] 在使用react过程中什么时候用HOC?
- win10 查看文件扩展名 - 教程篇
- layui table 时间戳
- ief12执行一次js才有效_陈列到底多久调一次才有效?
- java代码继承------多层继承
- silverlight将字符串转化为控件
- 【摩尔吧今日推荐】我们一定要给自己提出这样的任务:第一,学习,第二是学习,第三还是学习。
- go语言的字符串长度
- 从零开始学习CANoe(二)—— CANdb++ 创建 dbc文件
- 英雄联盟查服务器角色信息,LOL英雄联盟角色信息查询
- 关于SQL server 2012无法打开物理文件“某某某”,操作系统错误5 :(拒绝访问)。(Microsoft SQL Server,错误 5120)
- 苹果硬改技术好在哪里?
- 西北工业大学计算机学院推免,2021年西北工业大学接收推荐免试研究生预报名的通知...
- 罗马神话缪斯_缪斯与边缘– Adob​​e Web Designer的工具
- A_A02_004 J-LINK驱动安装
- BLE错误码全面解析连接失败原因错误码解析BLE Disconnect Reason