虽然网上有很多人说不要乱动 CentOS 系统搭配好的 Python 环境,因为有很多系统程序是基于 Python2 的,比如 yum。但仔细想想,那些程序对 Python 的引用不都是人为的么?作为一个规范的系统,在引用一个解析器这方面肯定是有章可循的,而且现在不是都在将工作环境转移到 Python3 了么?虽然现在都是用 virtualenv 虚拟环境来搭环境了,不在乎系统全局的 Python 是什么版本,但有时候就是想好好玩一下,如果你也想玩的话,请继续往下看哈~下面会拿两个例子说下 CentOS 中一些程序对 Python2 的依赖是如何继续保持的:
我用的是 python3.7 版本,如果是 python3.6 以下的版本,可以不一定要下面这个命令安装这么多依赖,但如果是 python3.7 的话,那就要了:
sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel
首先输入下面命令看一下当前 python2 的存在路径:
which python
显示的路径一般都是:
/usr/bin/python
再输入下面命令看一下目前 /usr/bin
目录下的 python
文件有哪些:
cd /usr/bin
ls python*
结果一般都是:
python python2 python2.7
其实这几个文件是有固定链接关系的:
[bin]$ ls -al python*
lrwxrwxrwx. 1 root root 7 4月 23 2019 python -> python2
lrwxrwxrwx. 1 root root 9 4月 23 2019 python2 -> python2.7
-rwxr-xr-x. 1 root root 7136 8月 4 2017 python2.7
这里的意思就是,系统在找 python
时, python
指向了 python2
,而 python2
又指向了 python2.7
,所以我们接下来就是让系统在输入 python2
时就是找 python2
,而输入 python
时去找 python3
,这无非就是 Linux 的软链接技巧而已,下面我们正式开始干:
sudo mv python python.bak
其实,如果不备份也是没关系的,只要 python2 还在就行了,因为本来那个 python 就是一个软链接,可以通过下面命令使得 python 还原:
sudo ln -s /usr/bin/python2 /usr/bin/python
/usr/local
下下载cd /usr/local
sudo wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz
sudo tar -xvf Python-3.7.3.tgz
sudo mkdir /usr/local/python3
cd /usr/local/Python-3.7.3
sudo ./configure --prefix=/usr/local/python3
sudo make
sudo make install
sudo ln -s /usr/local/python3/bin/python3 /usr/bin/python
python
python2
yum
这时,你会发现 yum 用不了了,那是因为本来 yum 是基于 python2 的,我们把 python 改为 python3.7 了,而 yum 还没反应过来,所以我们要帮他一把:
sudo vi /usr/bin/yum
把第一行的:
#!/usr/bin/python
改为:
#!/usr/bin/python2.7
保存退出,再输入 yum
试一下?
那么,我们做了这么多,究竟是做了些什么呢?输入下面代码可以查看:
[bin]$ ls -al python*
lrwxrwxrwx. 1 root root 30 4月 23 12:00 python -> /usr/local/python3/bin/python3
lrwxrwxrwx. 1 root root 9 4月 23 2019 python2 -> python2.7
-rwxr-xr-x. 1 root root 7136 8月 4 2017 python2.7
lrwxrwxrwx. 1 root root 7 4月 23 2019 python.bak -> python2
sudo ln -s /usr/local/python3/bin/pip3 /usr/bin/pip
你已经看到,上面的 yum 是如何在 Python3 的加入后继续找到它的 Python2 的了,其实也就是改一下其源程序文件开头那段解析器路径就可以了。比如防火墙的访问,如果输入平常使用的查看防火墙命令:
firewall-cmd --list-all
会报错,说什么'gi'模块找不到,我们总不能因为这一点小挫折就把辛苦弄来的 python3 改为 python2 吧?
所以我们还是要尽量找到根源的解决办法,毕竟 linux 不是 python2 做出来的,无非又是修改一下它们所需 python 的路径而已:
sudo vim /usr/bin/firewall-cmd
将首部的 python 路径改为 python2.7,同理:
sudo vim /usr/sbin/firewalld
同样是将头部的 python 改为 python2.7,修改好后再次执行:
firewall=cmd --list-all
如果还不行,那就继续找原因,目前我遇到的最多问题也就到这里解决了。相信其他程序对 Python2 的依赖都可以通过这样的方式保持~