最近有一个项目需要在服务端调用Python3.7写的算法,网上找了一圈,发现两个库都使用cgo特性调用了Python的C-API:

针对Python2:

针对Python3:


由于我这边的算法是Python3.7写的,自然使用go-python3这个库,安装方法也简单,使用下面的命令:

安装库时,可能会提示找不到python3.pc这个文件,这时可以先安装对应有dev包,用pyenv就可以安装,然后配置PKG_CONFIGPATH到对应的pkgconfig文件下,那里会有python3.pc。重新配置好PKG_CONFIG_PATH后,再执行go get命令应该就不会报错了。

参考命令如下:


Golang中调用Python3时,一定要注意设置包的查找路径,参考代码如下:

上面函数直接对系统的PATH变量进行了配置,dir变量用来传入自定义的模块路径(自已写的算法包等等),name是算法包的名字。

正常的调用步骤为:

  1. python3.Py_Initialize()初始化调用环境;
  2. 引入模块;
  3. GetAttrString()得到算法包;
  4. 配置传入参数,调用Call()执行算法;
  5. 解析算法返回的结果;
  6. python3.Py_Finalize()销毁Python3运行环境。

这里给出示例代码如下:

由于算法中返回多个值时对应的是Tuple,所以上面采用了PyTupleGetItem来得到相应的元素,但拿到这个值还不能直接输出使用,因为它还是PyObject类型,需要根据实际类型再调用As相关的函数进行一次转化后再输出,比如这里用的是pythone.PyLong_AsLong。


go-python3这个库的源码比较简单,可以直接查看,也可以对比https://docs.python.org/3.7/c-api/index.html去理解。这里写的是Python3的调用方法,至python2相关的可以参考GO语言中文网的一篇文章

里面用的是go-python库。