在Linux上编译安装Python3

目前在 Redhat 系列系统上,默认装的是 python2,在 RHEL8 及以上系统可以使用 yum 命令直接进行 rpm 包的安装。为了能够在 CentOS 上进行 Python 解释器多版本共存,就需要编译安装了。这里我结合了自身的经验,总结了一下 Python3 的编译安装。

首先要解决依赖关系。

1
yum -y install zlib zlib-devel  bzip2 bzip2-devel  ncurses ncurses-devel  readline readline-devel  openssl openssl-devel  openssl-static xz lzma xz-devel sqlite sqlite-devel  gdbm gdbm-devel  tk tk-devel libffi-devel

下载源码包解压并安装。为了方便以后能将编译好的解释器程序移植到其他机器,我的编译安装目录选择在 opt 下。

1
2
3
4
5
6
cd /opt/
wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz
tar xf Python-3.7.3.tgz -C /tmp/
cd /tmp/Python-3.7.3/
./configure --prefix=/opt/Python-3.7.3/
make && make install

使用绝对路径执行 python3 有可能会提示无法加载动态库,这是因为上面指定了安装目录,编译后的库也在安装目录下而不是系统的库目录。手动创建一个动态库加载路径的配置文件即可。

1
2
3
4
5
[root@m1 ~]# echo /opt/Python-3.7.3/lib/ > /etc/ld.so.conf.d/python-3.7.3.conf
[root@m1 ~]# ldconfig
[root@m1 ~]# /opt/Python-3.7.3/bin/python3 -V
Python 3.7.3
[root@m1 ~]#

每次执行 python3 都用绝对路径会非常不人性化,因此做个软连接。

1
2
3
4
5
[root@m1 ~]# ln -sv /opt/Python-3.7.3/bin/python3 /usr/bin/python3
‘/usr/bin/python3’ -> ‘/opt/Python-3.7.3/bin/python3’
[root@m1 ~]# python3 -V
Python 3.7.3
[root@m1 ~]#

如果要查看 man 文档,需要使用 man 命令及其 -M 选项指定 manpath

1
[root@m1 ~]# man -M /opt/Python-3.7.3/share/man/ python3

如果你不想这样做,也可以通过修改 /etc/man_db.conf 或者拷贝安装目录中的 man 文件到系统的 man 目录下。

m1 机器上编译安装一次之后,在其他机器(例如 m2 机器)就不需要再次编译安装了,在 m1 上把编译好的文件压缩打包,直接拷贝到 m2 上然后做几步配置即可。

1
2
3
4
[root@m1 ~]# cd /opt/
[root@m1 opt]# tar -jcf Python-3.7.3-MakeInstall.tar.bz2 Python-3.7.3
[root@m1 opt]# scp Python-3.7.3-MakeInstall.tar.bz2 192.168.127.132:/opt/
[root@m1 opt]#

m2 机器上的安装

1
2
3
4
5
6
7
8
9
[root@m2 ~]# cd /opt/
[root@m2 opt]# tar xf Python-3.7.3-MakeInstall.tar.bz2
[root@m2 opt]# echo /opt/Python-3.7.3/lib/ > /etc/ld.so.conf.d/python-3.7.3.conf
[root@m2 opt]# ldconfig
[root@m2 opt]# ln -sv /opt/Python-3.7.3/bin/python3 /usr/bin/python3
‘/usr/bin/python3’ -> ‘/opt/Python-3.7.3/bin/python3’
[root@m2 opt]# python3 -V
Python 3.7.3
[root@m2 opt]#

如果在后期出现了更新的版本,我们可以在 m1 上按照上述方法再次进行新版本的编译安装,这样就可以达到多版本共存的效果了。

有钱任性,请我吃包辣条
0%