本教程将教你如何在 Linux 环境下通过 Python 官方发布的源码安装包进行安装 Python 3.7 环境。本教程编写时(2018-04-10) Python 官网发布的 Python 3 最新版本为 3.7.3,本教程是在 CentOS 系统中测试安装的。其他 Linux 发行版应该也适用。

0x00 准备工作

首先需要通过安装一些依赖。

  1. CentOS 环境下
sudo yum -y install epel-release
sudo yum -y install axel
sudo yum -y install gcc openssl-devel bzip2-devel libffi-devel
  1. Ubuntu 环境下
sudo apt-get install -y axel make gcc \
    g++ openssl bzip2 libffi-dev zlib1g-dev \
    libssl-dev libsqlite3-dev

sudo apt install build-essential zlib1g-dev \
    libncurses5-dev libgdbm-dev libnss3-dev \
    libssl-dev libreadline-dev libffi-dev curl
  1. FreeBSD 环境下

虽然从严格意义上来说,FreeBSD 不应该算在 Linux,但这里顺便把 FreeBSD 下的也顺便说一下吧。

pkg install -y vim axel gcc openssl bzip2 libffi

0x01 下载 Python 源码包

本教程提供两种源码包的下载方式。(原因你懂的)

  1. 从官方下载
    访问 https://www.python.org/downloads/ 找到最新版的 Python 版本,本教程用的是 Python 3.7.3,点击相应的链接(本教程为 https://www.python.org/downloads/release/python-373/)。

XZ compressed source tarball

继续往下翻,在 Files 中找到 XZ compressed source tarball,在链接上右键获取链接。

https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz

获得地址之后就可以通过 curl 进行下载了。并且为了防止出现其他文件名的干扰,也为了方便安装后清理无用的文件,本人比较习惯创建一个新的临时目录来进行接下来的操作。

[root@CentOS ~]# pwd
/root
[root@CentOS ~]# ls
anaconda-ks.cfg
mkdir tmp
[root@CentOS ~]# cd tmp
[root@CentOS tmp]# pwd
/root/tmp
[root@CentOS tmp]# curl https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz -o Python-3.7.3.tar.xz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
 37 16.3M   37 6343k    0     0  37509      0  0:07:36  0:02:53  0:04:43     0

很明显,这里下载速度真的是辣眼睛,如果有足够的时间就慢慢等吧。

  1. 从笔者上传的地址下载。

访问网址: https://download.ismdeep.com/python/ 找到最新的 Python 3.7 版本.

python download folder on download.ismdeep.com

https://download.ismdeep.com/python/Python-3.7.3.tar.xz
mkdir tmp
cd tmp
axel -n 20 https://download.ismdeep.com/python/Python-3.7.3.tar.xz

0x02 安装

CentOS/Ubuntu

接上面下载目录继续使用下面命令进行安装 Python.

xz -d Python-3.7.3.tar.xz
tar -xvf Python-3.7.3.tar
cd Python-3.7.3
./configure --prefix=/usr/local/python-3.7.3 --enable-optimizations --enable-loadable-sqlite-extensions
sudo make -j8 build_all
sudo make -j8 altinstall

macOS

通过 brew 安装 xz ,sqlite3 以及 gdbm
Install xz and sqlite3 through brew

brew install xz
brew install sqlite3
brew install gdbm

编译 openssl 1.0.2

./Configure darwin64-x86_64-cc --prefix=/Users/ismdeep/Build/openssl-1.0.2u-binary
make
make install

编译 Python 3.7.3

./configure --prefix=/Users/ismdeep/Apps/python-3.7.3 \
    --with-openssl="/Users/ismdeep/Build/openssl-1.0.2u-binary" \
    --enable-optimizations \
    --enable-loadable-sqlite-extensions
make -j8 build_all
make -j8 altinstall

至此,我们的 Python 3.7 就已经安装完毕了。

看到网上很多教程,在最后都会去 /usr/bin 目录下做软链接,个人不太喜欢弄这个,并不想去影响系统已有的环境。那么我们该怎么使用我们的 python 呢。我们可以通过绝对路径去调用 python 和 pip.

比如:

/usr/local/python-3.7.3/bin/pip3.7 install requests
/usr/local/python-3.7.3/bin/python3.7 main.py

0x03 后记

很明显,我们在国内环境下使用 pip 安装包,速度是很慢的,慢到有时候根本就不动了。嗨呀,没办法,我们只能配置国内镜像源来安装包了。

在用户目录下的 .pip/pip.conf 文件中加入以下代码,比如用户目录是 /root,则为 /root/.pip/pip.conf 如果 .pip 目录不存在,则需要自己手动创建,这里就不再赘述了:

[global]
index-url = https://mirrors.huaweicloud.com/repository/pypi/simple
trusted-host = mirrors.huaweicloud.com
timeout = 120

各个系统的 pip 配置文件不定相同:

Windows: C:\Users\xxxx\pip\pip.ini (xxxx 表示用户名)

Linux: ~/.pip/pip.conf