iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Golang调用Python
  • 970
分享到

Golang调用Python

GolangPython 2023-01-31 02:01:49 970人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

摘要: python是时髦的机器学习御用开发语言,golang是大红大紫的新时代后端开发语言。Python很适合让搞算法的写写模型,而Golang很适合提供api服务,两位同志都红的发紫,这里就介绍一下正确搅基的办法。 ![干他一炮

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

Python是时髦的机器学习御用开发语言,Golang是大红大紫的新时代后端开发语言。Python很适合让搞算法的写写模型,而Golang很适合提供API服务,两位同志都红的发紫,这里就介绍一下正确搅基的办法。

干他一炮.jpg

原理

Python提供了丰富的C-API。而C和Go又可以通过cgo无缝集成。所以,直接通过Golang调用libpython,就可以实现Go调Python的功能了。确实没啥神奇,只要会用C调Python,马上就知道怎么用了。但问题是,如果有的选择,这个年代还有多少人愿意去裸写C和c++呢?诚心默念Golang大法好。

准备工作

  • Python :确保Python正确安装,所谓正确安装,就是在系统中能找到libpython.so(dylib),找到Python.h。一般linux直接安装python-develMac直接用homebrew安装就可以。
  • Golang安装:Golang不需要什么特殊的处理,能找到go即可。

安装libpython-go-binding

虽然直接用cgo调用libpython也不是不可以,但是有native-binding用起来肯定要爽的多。GitHub上有一个现成的Binding库go-python。

 go get github.com/sbinet/go-python

如果Python安装正确,这里会自动编译并显示提示,事就这样成了。

Have a try

首先写一个测试Python脚本

import numpy
import sklearn

a = 10

def b(xixi):
    return xixi + "haha"

然后写一个Go脚本:

package main

import (
    "github.com/sbinet/go-python"
    "fmt"
)

func init() {
    err := python.Initialize()
    if err != nil {
        panic(err.Error())
    }
}

var PyStr = python.PyString_FromString
var GoStr = python.PyString_AS_STRING

func main() {
    // import hello
    InsertBeforeSysPath("/Users/vonng/anaconda2/lib/python2.7/site-packages")
    hello := ImportModule("/Users/vonng/Dev/go/src/gitlab.alibaba-inc.com/cplus", "hello")
    fmt.Printf("[MODULE] repr(hello) = %s\n", GoStr(hello.Repr()))

    // print(hello.a)
    a := hello.GetAttrString("a")
    fmt.Printf("[VARS] a = %#v\n", python.PyInt_AsLong(a))

    // print(hello.b)
    b := hello.GetAttrString("b")
    fmt.Printf("[FUNC] b = %#v\n", b)

    // args = tuple("xixi",)
    bArgs := python.PyTuple_New(1)
    python.PyTuple_SetItem(bArgs, 0, PyStr("xixi"))

    // b(*args)
    res := b.Call(bArgs, python.Py_None)
    fmt.Printf("[CALL] b('xixi') = %s\n", GoStr(res))

    // sklearn
    sklearn := hello.GetAttrString("sklearn")
    skVersion := sklearn.GetAttrString("__version__")
    fmt.Printf("[IMPORT] sklearn = %s\n", GoStr(sklearn.Repr()))
    fmt.Printf("[IMPORT] sklearn version =  %s\n", GoStr(skVersion.Repr()))
}

// InsertBeforeSysPath will add given dir to python import path
func InsertBeforeSysPath(p string) string {
    sysModule := python.PyImport_ImportModule("sys")
    path := sysModule.GetAttrString("path")
    python.PyList_Insert(path, 0, PyStr(p))
    return GoStr(path.Repr())
}

// ImportModule will import python module from given directory
func ImportModule(dir, name string) *python.PyObject {
    sysModule := python.PyImport_ImportModule("sys") // import sys
    path := sysModule.GetAttrString("path")                    // path = sys.path
    python.PyList_Insert(path, 0, PyStr(dir))                     // path.insert(0, dir)
    return python.PyImport_ImportModule(name)            // return __import__(name)
}

打印输出为:

repr(hello) = <module 'hello' from '/Users/vonng/Dev/go/src/gitlab.alibaba-inc.com/cplus/hello.pyc'>
a = 10
b = &python.PyObject{ptr:(*python._Ctype_struct__object)(0xe90b1b8)}
b('xixi') = xixihaha
sklearn = <module 'sklearn' from '/Users/vonng/anaconda2/lib/python2.7/site-packages/sklearn/__init__.pyc'>
sklearn version =  '0.18.1'

这里简单解释一下。首先将这个脚本的路径添加到sys.path中。然后调用PyImport_ImportModule导入包

使用GetAttrString可以根据属性名获取对象的属性,相当于python中的.操作。调用Python函数可以采用Object.Call方法,,列表参数使用Tuple来构建。返回值用PyString_AS_STRING从Python字符串转换为C或Go的字符串。

更多用法可以参考Python-C API文档。

但是只要有这几个API,就足够 Make python module rock & roll。充分利用Golang和Python各自的特性,构建灵活而强大的应用了。



--结束END--

本文标题: Golang调用Python

本文链接: https://www.lsjlt.com/news/187109.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Golang调用Python
    摘要: Python是时髦的机器学习御用开发语言,Golang是大红大紫的新时代后端开发语言。Python很适合让搞算法的写写模型,而Golang很适合提供API服务,两位同志都红的发紫,这里就介绍一下正确搅基的办法。 ![干他一炮...
    99+
    2023-01-31
    Golang Python
  • python调用golang并回调
    最近折腾python交互,也真够呛的,一连玩了好几天,被虐的不要不要的。天天各种百度,Google之间。好吧,废话少说,转入我们的正题。其实,py调用go一般的函数,只是第一道坎,正主其实是py调用go,并且go还回调py!!!网上其实这...
    99+
    2023-01-31
    回调 python golang
  • golang怎么调用python脚本
    在Golang中调用Python脚本可以使用os/exec包来执行外部命令。下面是一个简单的示例代码:gopackage maini...
    99+
    2023-10-20
    golang python
  • golang过程调用
    Golang是一种快速、高效的开发语言,已经成为了著名的编程语言之一。在Golang中,过程调用是一项非常重要的功能,也是必须掌握的技能之一。在本文中,我们将详细介绍Golang中的过程调用,并且介绍一些相关的最佳实践和最新的技术。什么是过...
    99+
    2023-05-22
  • golang方法调用
    Go语言是一门高效、简洁、可靠的编程语言,近年来备受开发者们的青睐。在Go语言中,方法调用是一种常见的操作,在许多应用程序中都扮演着重要的角色。本文将深入探讨Go语言中方法调用的基本原则、语法规则以及实践技巧。一、基本原则在Go语言中,方法...
    99+
    2023-05-16
  • 如何实现Python调用Golang代码详解
    1.调用编译后的动态库文件,报头文件错误 原因: 不同平台下编译的add.so 不能通用,Windows下可以运行的so文件,linux下就不能运行,需要重新编译linux的so文件...
    99+
    2023-05-20
    Python调用golang方法 Python调用golang代码
  • 在Python里面调用Golang代码的方法
    这篇文章主要介绍了在Python里面调用Golang代码的方法,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。调用编译后的动态库文件,报头文件错误原因:不同平台下编译的add.so 不能通用,Windows下可以运行的so...
    99+
    2023-07-06
  • golang调度如何用
    这篇文章主要介绍了golang调度如何用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇golang调度如何用文章都会有所收获,下面我们一起来看看吧。调度器概述Golang调度器是Golang运行时系统中的一个组...
    99+
    2023-07-05
  • golang怎么调用ffmpeg
    在Go语言中调用FFmpeg,需要借助外部命令执行的方式,可以使用os/exec包来执行FFmpeg命令。首先,确保已经安装了FFm...
    99+
    2023-10-20
    golang
  • golang方法调用栈
    Golang作为一门高性能、简洁的编程语言,受到了越来越多程序员的关注和喜爱。在编写Golang程序时,我们经常会使用方法来组织代码,提高程序的可读性和可维护性。但是,在实际的开发过程中,我们很容易遇到方法调用栈溢出的问题。本文将重点介绍G...
    99+
    2023-05-15
  • golang怎么调用dll
    Golang作为编程语言,其强大的并发能力和高效的性能广受开发者的喜爱。在实际开发中,我们可能会涉及到和DLL(dynamic-link library)文件的交互,如何在Golang中调用DLL成为了一个重要问题。本文将介绍Golang如...
    99+
    2023-05-14
  • golang 包方法调用
    Go语言是一种越来越受欢迎的编程语言,它的一个独特之处在于其强大的包管理系统。包是Go语言最重要的概念之一,它为我们提供了抽象出代码单元的方法,并提供了代码复用的机制。本文将介绍如何调用包方法,并深入探讨Go语言包管理系统的优势。Go语言中...
    99+
    2023-05-14
  • golang不同包调用
    Go语言是一种开源的编程语言,它的出现有着很多优点,其中包括静态类型检查、垃圾回收和协程等。在使用Go语言进行开发时,使用不同包的函数和变量是一个常见的需求。本文将介绍一些关于Go语言不同包调用的方法和技巧。导入需要的包在Go语言中,我们需...
    99+
    2023-05-14
  • golang怎么调用c++库
    要在Golang中调用C++库,你需要使用CGo,它是Golang与C/C++代码交互的一种方式。下面是一个简单的示例,展示了如何调...
    99+
    2023-10-20
    golang c++
  • golang 反射调用方法
    反射是 Golang 中十分重要的一部分,它允许我们在运行时动态地查看和修改对象的类型、属性和方法。这种机制使得我们有了更多的灵活性和强大的能力。本文将重点介绍使用 Golang 反射调用方法的方法和技巧,希望对读者有所帮助。一、反射调用方...
    99+
    2023-05-15
  • golang反射调用方法
    前言在 Golang 中,反射机制是一种重要的功能,它可以在运行时动态地获取变量的类型和值,并可以动态地调用方法,特别是对于一些具有通用性的代码实现和一些框架的实现,反射机制是必不可少的。本文将通过一个实例来介绍在 Golang 中如何使用...
    99+
    2023-05-15
  • golang 动态调用方法
    Golang是一门非常强大的语言,可以用于构建各种类型的应用,从命令行工具到Web应用和分布式系统,甚至还可以用于机器学习和数据科学等领域。在Golang中,可以通过反射来动态地调用方法。反射是一种能够在运行时检查程序类型、变量类型和方法的...
    99+
    2023-05-14
  • golang如何调用shell命令
    这篇文章主要介绍了golang如何调用shell命令的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇golang如何调用shell命令文章都会有所收获,下面我们一起来看看吧。普通用法(一次性获取所有输出)pack...
    99+
    2023-07-05
  • golang调度设置
    Golang是一种高效且易于使用的编程语言,它的调度机制是其优秀性能的重要因素之一。在Golang中,调度器控制着所有的Goroutine,Goroutine是Go语言的轻量级线程,每个Goroutine都可以独立运行,实现高并发的效果。为...
    99+
    2023-05-19
  • golang怎么调试
    goland中调试的方法:1、golang软件并新建一个项目;2、编写一个完整的go代码;3、使用鼠标在代码前点击插入断点;4、右键选中新建的goland项目;5、选择“Debug”→“go build goexample”;6、最后使用【...
    99+
    2022-10-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作