美文网首页Go量化
Golang与Python的亲密接触

Golang与Python的亲密接触

作者: 码洞 | 来源:发表于2018-03-02 18:35 被阅读73次

    会玩Go!会玩Python!嘭!Go-Python!

    —— PPAP大叔

    Golang是静态语言,性能很好,当它不那么灵活,不好在运行时动态运行代码。Python是动态语言,非常灵活,但是性能很差。古人云:“鱼和熊掌不能兼得”。但是如今有了Go-Python,鱼和熊掌也可以兼得。

    首先安装go-python

    go get github.com/sbinet/go-python

    我们使用下面的代码启动Python命令行解释器 go run test.go

    代码很简单,先初始化,然后将命令行参数传递进Py_Main函数就可以进入Python命令行解释器,就像直接敲python命令一样

    如果我们执行 go run main.go --version就可以查看Python版本信息

    接下来我们使用golang打印一下Python环境的sys.path变量

    首先调用PyImport_ImportModule导入sys包,然后取出path对象,再获取path的长度,使用循环挨个取出列表中的字符串,打印出来

    我们看到默认sys.path里面没有包含当前目录,这意味着不能直接在当前目录导入模块。

    接下来我们在sys.path里面加入当前目录

    我们在sys.path列表的头部插入了空串,表示将当前目录加入sys.path,于是当前目录成为优先查找路径。

    有了上面的代码,我们可以试一试调用自定义python模块了,先写一个斐波那契级数

    这是一个递归版本的实现,n的大小不能超过最大栈深,好,下面使用go调用它

    因为当前目录已经插入sys.path,我们可以直接使用PyImport_ImportModule导入fib模块,然后获取fib函数对象,注意函数也是一个PyObject对象。将整数10传递进fib函数,得到结果打印出来。

    接下来我们尝试在自定义模块里使用requests访问一下百度首页,如果能使用第三方Python模块,那么go-python也就比较Ok了。

    touchBaidu返回的是一个requests.Response对象,该对象里的属性status_code表示返回状态码,content属性表示返回内容。

    何时使用go-python

    你需要一个功能,没有开源的go实现,但是python有,并且性能不是很重要

    你需要一个脚本语言嵌入到go中,让go代码获得动态能力

    你想使用Cython干一些hack的事但是又不想撸C语言

    go-python有什么缺点

    python虚拟机是全局的,意味着线程不安全,在必要的地方要使用GIL保护

    python会拖慢golang的性能,在性能重要的场合谨慎使用

    阅读相关文章,关注微信公众号/知乎专栏/头条号【码洞】

    相关文章

      网友评论

        本文标题:Golang与Python的亲密接触

        本文链接:https://www.haomeiwen.com/subject/ybxzxftx.html