前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CentOS上用python3替换python2好不好?

CentOS上用python3替换python2好不好?

作者头像
benny
发布2019-05-14 17:27:39
1.8K0
发布2019-05-14 17:27:39
举报
文章被收录于专栏:程序员的碎碎念

好!

有什么不可以的?

虽然网上有很多人说不要乱动 CentOS 系统搭配好的 Python 环境,因为有很多系统程序是基于 Python2 的,比如 yum。但仔细想想,那些程序对 Python 的引用不都是人为的么?作为一个规范的系统,在引用一个解析器这方面肯定是有章可循的,而且现在不是都在将工作环境转移到 Python3 了么?虽然现在都是用 virtualenv 虚拟环境来搭环境了,不在乎系统全局的 Python 是什么版本,但有时候就是想好好玩一下,如果你也想玩的话,请继续往下看哈~下面会拿两个例子说下 CentOS 中一些程序对 Python2 的依赖是如何继续保持的:


我用的是 python3.7 版本,如果是 python3.6 以下的版本,可以不一定要下面这个命令安装这么多依赖,但如果是 python3.7 的话,那就要了:

代码语言:javascript
复制
sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel
本次操作的原理

首先输入下面命令看一下当前 python2 的存在路径:

代码语言:javascript
复制
which python

显示的路径一般都是:

代码语言:javascript
复制
/usr/bin/python

再输入下面命令看一下目前 /usr/bin目录下的 python文件有哪些:

代码语言:javascript
复制
cd /usr/bin

ls python*

结果一般都是:

代码语言:javascript
复制
python  python2  python2.7

其实这几个文件是有固定链接关系的:

代码语言:javascript
复制
[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 的软链接技巧而已,下面我们正式开始干:

1、备份原来的python,以防万一
代码语言:javascript
复制
sudo mv python python.bak

其实,如果不备份也是没关系的,只要 python2 还在就行了,因为本来那个 python 就是一个软链接,可以通过下面命令使得 python 还原:

代码语言:javascript
复制
sudo ln -s /usr/bin/python2 /usr/bin/python
2、我们在 centos 上的一个目录下下载 python3 的安装包,我这里在 /usr/local下下载
代码语言:javascript
复制
cd /usr/local

sudo wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz
3、解压缩到当前文件夹
代码语言:javascript
复制
sudo tar -xvf Python-3.7.3.tgz
4、创建 python3 目录
代码语言:javascript
复制
sudo mkdir /usr/local/python3
5、进入解压缩后的文件夹并编译
代码语言:javascript
复制
cd /usr/local/Python-3.7.3
sudo ./configure --prefix=/usr/local/python3
sudo make
sudo make install
6、建立 python3 的软链接到 python
代码语言:javascript
复制
sudo ln -s /usr/local/python3/bin/python3 /usr/bin/python
7、验证一下
代码语言:javascript
复制
python

python2

yum

这时,你会发现 yum 用不了了,那是因为本来 yum 是基于 python2 的,我们把 python 改为 python3.7 了,而 yum 还没反应过来,所以我们要帮他一把:

代码语言:javascript
复制
sudo vi /usr/bin/yum

把第一行的:

代码语言:javascript
复制
#!/usr/bin/python

改为:

代码语言:javascript
复制
#!/usr/bin/python2.7

保存退出,再输入 yum试一下?

那么,我们做了这么多,究竟是做了些什么呢?输入下面代码可以查看:

代码语言:javascript
复制
[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
8、还有 pip 也要变成 Python3 的
代码语言:javascript
复制
sudo ln -s /usr/local/python3/bin/pip3 /usr/bin/pip

拓展补充

你已经看到,上面的 yum 是如何在 Python3 的加入后继续找到它的 Python2 的了,其实也就是改一下其源程序文件开头那段解析器路径就可以了。比如防火墙的访问,如果输入平常使用的查看防火墙命令:

代码语言:javascript
复制
firewall-cmd --list-all

会报错,说什么'gi'模块找不到,我们总不能因为这一点小挫折就把辛苦弄来的 python3 改为 python2 吧?

所以我们还是要尽量找到根源的解决办法,毕竟 linux 不是 python2 做出来的,无非又是修改一下它们所需 python 的路径而已:

代码语言:javascript
复制
sudo vim /usr/bin/firewall-cmd

将首部的 python 路径改为 python2.7,同理:

代码语言:javascript
复制
sudo vim /usr/sbin/firewalld

同样是将头部的 python 改为 python2.7,修改好后再次执行:

代码语言:javascript
复制
firewall=cmd --list-all

如果还不行,那就继续找原因,目前我遇到的最多问题也就到这里解决了。相信其他程序对 Python2 的依赖都可以通过这样的方式保持~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员的碎碎念 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 好!
  • 有什么不可以的?
    • 本次操作的原理
    • 拓展补充
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档