记一个golang安装go-python3(Ubuntu&Win)

记一个golang调用python3(Ubuntu&Win)

    • 一、配置环境
      • 1. 安装子系统、go环境
      • 2. 安装python3.7。
      • 3. 安装python3.7-dev
        • 直接安装
        • 换源
        • aptitude的使用
        • 删除错误下载
    • 二、配置pkg-config
      • 1. 简述
      • 2. 创建pc文件
    • 三、安装go-python3
    • 四、win平台使用
      • 1. python3环境
      • 2. TDM-GCC
      • 3. pkg-config.exe
      • 4. pkg-config搜索路径
    • 五、其他

一、配置环境

1. 安装子系统、go环境

我这里使用的是win子系统——WSL(Windows Subsystem for Linux),去Microsoft Store安装一个即可。
版本是img
如果还有别的心思,还可以装一个lxrunoffline玩玩,迁移子系统的安装路径。
另外,默认是没有复制粘贴功能的,可以右键图标打开默认值设置
记一个golang安装go-python3(Ubuntu&Win)_第1张图片
 
找个位置装go

wget https://golang.org/dl/go1.15.2.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.15.2.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version

进入系统,安装go,配置代理,配置其他环境……

因为是子系统,可以在win资源管理器上实现很多功能,不用那么麻烦打一大串字,在浏览器上下载压缩包
记一个golang安装go-python3(Ubuntu&Win)_第2张图片
找个位置粘贴,然后解压配置环境即可
记一个golang安装go-python3(Ubuntu&Win)_第3张图片
img
Linux下装东西,又没别人用,直接root完事了。su root
  

2. 安装python3.7。

apt-get install python3.7
由于go-python3只支持3.7,版本大一点,小一点都不行,所以必须3.7,3.6、3.8、2.7都不可以,必然报错,python2.7有专门的go-python库,与本文无关。
成功配置如图记一个golang安装go-python3(Ubuntu&Win)_第4张图片如果输入python出来不是python3.7,而是其他版本,修改etc/bin下的连接即可ln -s /usr/bin/python3.7 /usr/bin/python
 

3. 安装python3.7-dev

为了能够正确调用python3.7,跨语言使用python3.7,linux下必须下载这个python3.7-dev,这个python3.7-dev包含了python3.7的库文件(libpython3.7m.a和libpython3.7.so),相当于windows的VC下编译的lib文件。

直接安装

试试这个指令

apt-get install python3.7-dev

网上很多教程是叫你apt-get install python3-dev,神坑,一定是python3.7-dev。
因为你不能保证你下载的python-dev版本是不是这个3.7版本,很有可能是python3.8-dev或者python3.6-dev,直接导致后边无法使用。

细心留意一下,apt-get install 后有提示即将安装什么package的,不要用急着y/n

如果不小心下错了,继续阅读,后边有解决方案。

如果成功下载,直接转到配置pkg-config。后边是给下载不成功的准备的。

换源

针对apt install 后提示E: Unable to locate package。换个源即可

首先配置apt的阿里源,不要用清华源。
记一个golang安装go-python3(Ubuntu&Win)_第5张图片
编辑sources.list文件(vim /etc/apt/sources.list,在WSL里,你甚至都没必要用vim)。添加如下源(源于百度,请批判使用),对这个没什么概念,直接复制粘贴的

deb http://mirrors.aliyun.com/ubuntu/ vivid main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ vivid-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ vivid-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ vivid-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ vivid-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ vivid main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ vivid-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ vivid-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ vivid-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ vivid-backports main restricted universe multiverse

如果源用不了,就换另外一个,总有一个能用的。

编辑保存以后,apt-get update apt-get upgrade,更新一下,结束apt-get配置。
现在,我们可以再尝试一下刚才的指令试这个指令apt-get install python3.7-dev,如果成功,请跳到配置pkg-config。

aptitude的使用

查网上资料,有说,如果apt-get安装不了python-dev的话,用aptitude。
什么是aptitude?

aptitude与 apt-get 一样,是 Debian 及其衍生系统中功能极其强大的包管理工具。与 apt-get 不同的是,aptitude在处理依赖问题上更佳一些。举例来说,aptitude在删除一个包时,会同时删除本身所依赖的包。系统中不会残留无用的包,整个系统更为干净
——百度百科《aptitude》

换句话说,aptitude就是一个“变种”的apt-get

apt-get install aptitude
aptitude install python3.7-dev

结束安装。

删除错误下载

到这里,我们很可能已经出现了下载错误的问题,没有关系。我们可以:

……
apt-get install aptitude
aptitude remove python3.7-dev
aptitude remove python3-dev
aptitude remove python-dev
……

把下错的删掉。因为用aptitude remove删东西,会把依赖也删掉,很方便。
在/usr/bin路径下,看看不小心下错的东西。

 

二、配置pkg-config

到这里,可以尝试go get github.com/DataDog/go-python3,如果成功,那么后文就不用看了,到此已结束,其他语言调用python的用法大同小异,与本文无关。

1. 简述

pkg-config是个什么东西?

pkg-config 是一个在源代码编译时查询已安装的库的使用接口的计算机工具软件。pkg-config原本是设计用于Linux的,但现在在各个版本的BSD、windows、Mac OS X和Solaris上都有着可用的版本。
——维基百科《pkg-config》

也就是说,其实你在win系统下也可以使用pkg-config,详见后文。

这个pkg-config其实不仅在操作系统有所应用,在QT上也能看到它的踪迹:
图为C++qt使用python,下为pro文件里添加的内容:

记一个golang安装go-python3(Ubuntu&Win)_第6张图片
可以在Qt Creator里右键项目添加库……进行可视化添加。

记一个golang安装go-python3(Ubuntu&Win)_第7张图片
本质上来说,配置pkg-config就是配置一个可供其他语言调用的环境。
这也是我们一定要下载python-dev的原因,在win操作系统下的python,就已经自带python.lib文件。打开win下的python目录下libs文件夹,可以看到这几个lib文件
记一个golang安装go-python3(Ubuntu&Win)_第8张图片
但是,我们的linux系统里的python没有这个.lib对应的.a文件,也用不了.lib文件,很尴尬,怎么办?这个时候,我们就需要安装python-dev。
如果可以的话,可以卸载了python3.7-dev,重新安装一下,看一下到底多出了什么东西。
多出来这样一个东西(/usr/lib/python3.7或者可能在usr/local/lib/python3.7):
记一个golang安装go-python3(Ubuntu&Win)_第9张图片多出了这样一个文件夹config-3.7m-x86_64-linux-gnu。
记一个golang安装go-python3(Ubuntu&Win)_第10张图片
各种文件一目了然。
 

2. 创建pc文件

其实到这里,已经可以查看pkg-config了。输入pkg-config --list-all,查看所有可以找到的包。其实里面已经配置好python3.7的pkg-config了,那个python-3.7m和python-3.7明显就是安装python3.7-dev时,自动配置好了。
记一个golang安装go-python3(Ubuntu&Win)_第11张图片
但很明显,这个时候我go get github.com/DataDog/go-python3还是失败了,莫名其妙,痛苦不堪。

没有办法,创造办法。

查看pkg-config的默认搜索路径:pkg-config --variable pc_path pkg-config
img
如果有其他心思,可以在自己的profile文件下添加/设置搜索路径,把搜索路径设置到项目里的路径等等,这里提供一个全局设置的参考:vim /etc/profile
img
回归正题。知道了pkg-config的搜索路径以后,我们就可以在某一个搜索路径下创建.pc文件:我在/usr/lib/pkgconfig目录下,创建了python3.pc文件。
简要说一下pc文件的格式:

Name: 该模块的名字
Description: 模块的简单描述
Version: 版本号。
Cflags: 用于写当前模块的头文件的路径。
Libs: 用于写当前模块的库/依赖库的路径。

这就是python3.pc文件里的内容,Name和Version和Description对着随便填
记一个golang安装go-python3(Ubuntu&Win)_第12张图片
剩下CFlags和Libs。

还记得之前提到过的config-3.7m-x86_64-linux-gnu文件夹吗?在那个目录下输入python python-config.py
img
它提示了这个指令有什么用。
Usage下,什么libs什么cflags什么ldflags什么includes,几乎和前面qt的pro文件配置一一对应,也和pkg-config设置一一对应。
我们需要CFlags和Libs,于是:

cd /usr/lib/python3.7/config-3.7m-x86-linux-gnu
python3.7 python-config.py --cflags
python3.7 python-config.py --libs

记一个golang安装go-python3(Ubuntu&Win)_第13张图片
pkg-config的cflags不需要那么多参数,取前面一截路径即可
记一个golang安装go-python3(Ubuntu&Win)_第14张图片
保存文件,输入
img
一切正常,说明配置成功了。

 

三、安装go-python3

go get github.com/DataDog/go-python3即可,终于没有报其他奇怪的错误,一切调用正常。

四、win平台使用

这个问题的答案:go-python3 issues24
其实,没有答案里说得那么麻烦复杂

1. python3环境

没什么好说的,注意一下,把项目中需要使用到的包,比如tensorflow、keras之类的装好就行

2. TDM-GCC

在TDM-GCC官网下载,安装
比如说我,就直接装到C盘,C:/TDM-GCC
配置TDM-GCC环境,在PATH中,添加TDM-GCC的bin目录
记一个golang安装go-python3(Ubuntu&Win)_第15张图片

3. pkg-config.exe

参考stack overflow
下载两个文件,一个是pkg-config,一个是glib
https://iso.mirrors.ustc.edu.cn/gnome/binaries/win32/dependencies/pkg-config_0.26-1_win32.zip
https://iso.mirrors.ustc.edu.cn/gnome/binaries/win32/glib/2.28/glib_2.28.8-1_win32.zip

这两个东西下载完成以后
找到压缩包里的 pkg-config.exelibglib-2.0-0.dll,放到TDM-GCC的bin文件夹下,即./TDM-GCC/bin
记一个golang安装go-python3(Ubuntu&Win)_第16张图片

4. pkg-config搜索路径

这一步,和上面的很相似
把python3.pc给写出来。

prefix=C:/python
exec_prefix=${prefix}
libdir=${exec_prefix}
includedir=C:/python/include

Name: Python
Description: Python library 
Requires:
Version: 3.7
Libs: -L${libdir} -lpython37 -lpthread -lm
Cflags: -I${includedir} -DMS_WIN64

保存到想要搜索的目录,比如我的是 C:/pkg-config,然后设置win环境变量,新建一个PKG_CONFIG_LIBDIR,指向 C:/pkg-config
其实 PKG_CONFIG_PATH 也行,但是 PKG_CONFIG_LIBDIR 的优先级更高
记一个golang安装go-python3(Ubuntu&Win)_第17张图片
然后就随意搞了

五、其他

分享一个go调用C再调用python的例子:Go语言高级编程
第三章2.10,有兴趣可以分享交流

创作不易,分享本文@原文即可。
或者请作者喝杯咖啡~
记一个golang安装go-python3(Ubuntu&Win)_第18张图片

你可能感兴趣的:(go,go-python,golang,ubuntu,linux,python)