CentOS7 安装 Python3

CentOS7 的基础环境

关于 CentOS 的安装过程就不介绍了,网上搜索相关资料照着安装即可。
以下是我当前 CentOS7 系统的版本信息:

1
2
3
4
5
# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)

# uname -a
Linux CentOS 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

先来看下当前系统预装的 Python 版本:

1
2
# python -V
Python 2.7.5

再看看 pip 是否安装了:

1
2
# pip -V
-bash: pip: 未找到命令

CentOS7 下安装 pip

yum 是 CentOS 的软件包管理器,可以使用它在线安装软件。 依次执行以下命令就可以安装 pip 了,当然前提机器是可以上网的,

1
2
3
4
5
6
7
8
9
10
11
12
# yum -y install epel-release
......
已安装:
epel-release.noarch 0:7-11

完毕!

# yum -y install python-pip
......
已安装:
python2-pip.noarch 0:8.1.2-8.el7
......

查看 pip 是否安装成功了:

1
2
# pip -V
pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)

pip 安装成功, 如果你想升级 pip,可以执行下面的命令升级 pip:

1
2
3
4
5
6
# pip install --upgrade pip
......
Successfully installed pip-19.1

# pip -V
pip 19.1 from /usr/lib/python2.7/site-packages/pip (python 2.7)

pip 升级成功了。

安装 Python3

我们知道 Python2 到 2020 年官方就停止更新了,所以,是时候拥抱 Python3 了。先在 https://www.python.org上查看当前 linux 下 python3 的最新版本,然后使用 wget 命令将软件包下载下来:

1
2
3
4
# wget https://www.python.org/ftp/python/3.8.0/Python-3.8.0a3.tgz

# ls
anaconda-ks.cfg Python-3.8.0a3.tgz

下载成功了,然后解压到当前目录下:

1
2
3
4
5
6
7
# tar -xzvf Python-3.8.0a3.tgz

# ll
总用量 22772
-rw-------. 1 root root 1417 4月 15 05:41 anaconda-ks.cfg
drwxr-xr-x. 18 clt clt 4096 3月 26 03:44 Python-3.8.0a3
-rw-r--r--. 1 root root 23307857 3月 26 04:03 Python-3.8.0a3.tgz

解压成功,进入解压后的目录,然后编译:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# cd Python-3.8.0a3

# ./configure prefix=/usr/local/python3
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking for python3.8... no
checking for python3... no
checking for python... python
checking for --enable-universalsdk... no
checking for --with-universal-archs... no
checking MACHDEP... checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/root/Python-3.8.0a3':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details

发现生成 Makefile 失败了,提示没有安装编译器 gcc,好吧,接下来安装 gcc:

1
2
3
4
5
# yum -y install gcc gcc-c++ kernel-devel 

# gcc -v
......
gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)

编译器安装成功后,接下执行编译命令:

1
2
3
4
5
6
7
8
# ./configure prefix=/usr/local/python3

# make && make install
......
ERROR:root:code for hash md5 was not found.
......
ImportError: cannot import name 'sha512' from 'hashlib' (/root/Python-3.8.0a3/Lib/hashlib.py)
make: *** [install] 错误 1

这是因为 python 编译的时候没有 openssl 依赖(依赖 libssl.so 和 libcrypto.so),执行以下命令(libssl.so 和 libcrypto.so 的版本和安装路径未必一样,需要根据实际情况填写):

1
2
3
# ln -s /usr/lib64/libssl.so.1.0.2k libssl.so

# ln -s /usr/lib64/libcrypto.so.1.0.2k libcrypto.so

然后重新编译:

1
2
3
4
5
6
7
8
# ./configure /usr/local/python3

# make && make install
......
zipimport.ZipImportError: can't decompress data; zlib not available
......
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] 错误 1

要崩溃了。。。linux 上通过源码编译安装有时候就是这样,各种依赖,所以也只能一个依赖一个依赖的去解决。那我再安装 zlib 相关的依赖:

1
# yum -y install zlib*

然后再重新编译:

1
2
3
4
# make && make install
......
ModuleNotFoundError: No module named '_ctypes'
make: *** [install] 错误 1

我。。。不信了,再安装依赖:

1
# yum -y install libffi-devel

再重新编译、安装:

1
2
3
4
5
6
7
8
# yum -y install libffi-devel

# make && make install
......
Collecting setuptools
Collecting pip
Installing collected packages: setuptools, pip
Successfully installed pip-19.0.3 setuptools-40.8.0

这次终于都安装成功了.

进到安装目录下看看:

1
2
3
4
5
6
7
# cd /usr/local/python3/bin/

# ./python3 -V
Python 3.8.0a3

# ./pip3 -V
pip 19.0.3 from /usr/local/python3/lib/python3.8/site-packages/pip (python 3.8)

没问题了,接着先备份原来的 python2 及 pip2:

1
2
3
4
5
6
7
8
9
# whereis python
python: /usr/bin/python /usr/bin/python2.7 /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7 /usr/share/man/man1/python.1.gz

# mv /usr/bin/python /usr/bin/python2

# whereis pip
pip: /usr/bin/pip /usr/bin/pip2.7

# mv /usr/bin/pip /usr/bin/pip2

然后为 python3 及 pip3 创建软连接:

1
2
3
4
5
6
7
8
9
# ln -s  /usr/local/python3/bin/python3 /usr/bin/python

# ln -s /usr/local/python3/bin/pip3 /usr/bin/pip

# python -V
Python 3.8.0a3

# pip -V
pip 19.0.3 from /usr/local/python3/lib/python3.8/site-packages/pip (python 3.8)

至此 python3 安装完成了。但是这个时候再去使用 yum 去安装软件就会报错:

1
2
3
4
5
# yum -y install gcc
File "/usr/bin/yum", line 30
except KeyboardInterrupt, e:
^
SyntaxError: invalid syntax

这是因为 yum 是使用 python2 编写的,所以需要把 yum 的头文件改成用 python2 作为解释器:

1
2
3
4
5
6
# whereis yum
yum: /usr/bin/yum /etc/yum /etc/yum.conf /usr/share/man/man8/yum.8

# vim /usr/bin/yum

其中,#!/usr/bin/python 改成 #!/usr/bin/python2 即可