在Linux系统中编译安装Python3,我想是一个Python学习者必经的一个环节。
你可以使用Ubuntu自带的Python3,不过你不能自由的控制版本,还要单独安装pip3,如果你想升级pip3,还会出现一些让人不愉快的使用问题。而在CentOS系统中,默认只有Python2,通过yum安装Python3,也同样面临版本落后以及pip3的问题。如果不自己编译安装,还有什么别的方法来一直保持使用最新的版本呢?!除非你用Win系统。
本文介绍如何在Ubuntu和CentOS这两个常用的LFS系统中,编译安装Python3的方法。主要的区别是,在这个两个平台上安装的依赖库不太一样(名称不一样)!在Linux系统中编译安装软件,最大的困扰,可能就是安装各种依赖库了。为了解决这个问题,yum,apt,docker等技术都出来了......
在CentOS中安装Python3需要的依赖库
$ sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel expat-devel gdbm-devel xz-devel db4-devel libpcap-devel
如果系统已经存在上面的某些库,以上安装指令只是对其进行升级,没有别的影响。
在Ubuntu中安装Python3需要的依赖库
$ sudo apt install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libbz2-dev zlib1g-dev libffi-dev liblzma-dev
安装GCC
CentOS的minimal版本,以及Ubuntu,都没有预装gcc,如果你用的是这两个版本,需要确保系统有gcc编译器可以使用。安装和查看gcc的方法:
$ sudo yum install gcc # install gcc in centos
$ sudo apt install gcc # install gcc in ubuntu
$ which gcc # check if gcc is there
$ gcc --version # check gcc version
下载Python3源码并解压
使用curl或wget下载,然后解压:
$ curl -O https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz
$ wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz
$ tar zxf Python-3.7.3.tgz
执行configure
进入上一步的解压目录,然后执行configure:
$ cd Python-3.7.3
$ ./configure --prefix=/usr/local/python-3.7
然后,你会看到一推checking...在安装Python3需要的依赖包的情况下,不会有错误提示出现。--prefix的作用是给出一个安装路径。
我们可以在configure的时候,增加一个优化参数,--enable-optimizations。增加这个参数,会启动编译器的PGO( Profile guided optimization )优化,后续进行make的时候,Python3会执行一大推很费时费力的test来保证优化没有问题。如果你不赶时间,可以考虑加这个这个参数,因为你可以让Python的解释器的执行速度增加大概10%-20%。
$ ./configure --prefix=/usr/local/python-3.7 --enable-optimizations
make和install
最后,我们执行make和install的指令。
$ make && sudo make install
make install 前要有sudo,因为我们在configure的时候,指定的安装路径为系统路径,不是用户的/home/user路径。
创建符号链接
make和install成功之后,Python3就已经安装在了这个路径下:/usr/local/python-3.7。这个路径下的bin目录,包含了我们需要的程序:
$ pwd
/usr/local/python3.7/bin
$ ls -l
total 24720
lrwxrwxrwx. 1 root root 8 May 23 21:29 2to3 -> 2to3-3.7
-rwxr-xr-x. 1 root root 111 May 23 21:29 2to3-3.7
-rwxr-xr-x. 1 root root 251 May 23 21:29 easy_install-3.7
lrwxrwxrwx. 1 root root 7 May 23 21:29 idle3 -> idle3.7
-rwxr-xr-x. 1 root root 109 May 23 21:29 idle3.7
-rwxr-xr-x. 1 root root 233 May 23 21:29 pip3
-rwxr-xr-x. 1 root root 233 May 23 21:29 pip3.7
lrwxrwxrwx. 1 root root 8 May 23 21:29 pydoc3 -> pydoc3.7
-rwxr-xr-x. 1 root root 94 May 23 21:29 pydoc3.7
lrwxrwxrwx. 1 root root 9 May 23 21:29 python3 -> python3.7
-rwxr-xr-x. 2 root root 12620752 May 23 21:27 python3.7
lrwxrwxrwx. 1 root root 17 May 23 21:29 python3.7-config -> python3.7m-config
-rwxr-xr-x. 2 root root 12620752 May 23 21:27 python3.7m
-rwxr-xr-x. 1 root root 3115 May 23 21:29 python3.7m-config
lrwxrwxrwx. 1 root root 16 May 23 21:29 python3-config -> python3.7-config
创建符号链接的目的,是为了让我们在系统中的任何位置(路径)下,都可以直接输入python3来启动python解释器。为了达到这个目的,我们需要在/usr/bin路径下放置符号链接文件,指向上面的安装路径。
$ sudo ln -s /usr/local/python3.7/bin/python3.7 /usr/bin/python3
$ sudo ln -s /usr/local/python3.7/bin/pip3.7 /usr/bin/pip3
Ubuntu系统自带的Python3也是一个符号链接,指向同路径下的python3.x,必须要先删除这个符号链接,才能创建新的。同目录下的python3.x,这个信息也许在你需要恢复使用系统自带python3时,能用得上。
编译安装成功
按照以上步骤,编译安装就成功了,最后我们来做一点检查:
$ readlink /usr/bin/python3
/usr/local/python3.7/bin/python3.7
$ readlink /usr/bin/pip3
/usr/local/python3.7/bin/pip3
$ python3 -V
Python 3.7.3
$ pip3 -V
pip 19.0.3 from /usr/local/python3.7/lib/python3.7/site-packages/pip (python 3.7)
以上检查了我们创建的符号链接,并运行python3和pip3这两个程序,查看其对应的版本号。注意我们创建的符号链接是python3和pip3,后面都有3,这是为了与系统中的python(版本2)共存。
Ubuntu很适合当桌面环境。
现在不喜欢给pip创建符号连接了。用 python3 -m pip 的方式使用 pip,在install的时候,带上 --user 参数!(python3 -m pip install --user xxxxx)
-- EOF --