抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

从源码安装 python

获取 python 源码

在 python 官网的 ftp目录 进入你想要的版本的文件夹,并复制其中的 Python-x.x.x.tgz 的链接,本教程以 Python 3.8.10 为例。在 Linux 终端进入一个你认为合适的位置,使用你喜欢的工具获取 Python 源码,这里以 wget 为例。

1
wget https://python.org/ftp/python/3.8.10/Python-3.8.10.tgz

下载完成后解压。

1
tar -zxvf Python-3.8.10.tgz

准备编译环境

编译 Python 需要 gcc、make 以及 zlib、libffi、bzip2、openssl 等等一大堆依赖库。

1
apt update && apt install -y gcc make zlib1g-dev libffi-dev libssl-dev libbz2-dev
1
yum update && yum install -y gcc make zlib-devel libffi-devel openssl-devel bzip2-devel
1
pacman -Syy --noconfirm gcc make zlib libffi openssl bzip2

编译 python

进入解压的 python 文件夹,为了链接 openssl相关库,我们需要修改 Modules/Setup。找到以下内容:

1
2
3
4
5
6
7
8
9
10
- #SSL=/usr/local/ssl
- #_ssl _ssl.c \
- # -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
- # -L$(SSL)/lib -lssl -lcrypto

+ SSL=/usr/local/ssl
+ _ssl _ssl.c \
+ -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
+ -L$(SSL)/lib -lssl -lcrypto
(line 210-213)

取消注释后保存并退出。

初始化编译参数。这一步的参数 --enable-optimizations 建议加上,编译用时会增加,但编译后的 python 运行效率比没加这个参数的高 10% 左右甚至更高。

1
./configure --enable-optimizations

当看初始化完成后可以看到以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
checking for openssl/ss1.h in /usr/local/ss1... no
checking for openssl/ssl.h in /usr/lib/ss1... no
checking for openss1/ssl.h in /usr/ssl... no
checking for openss1/ssl.h in /usr/pkg... no
checking for openss1/ssl.h in /usr/local... yes
checking for openss1/ssl.h in /usr... no
checking whether compiling and linking against OpenSSL works... yes
checking for --with-ssl-default-suites... python
configure : creating ./config .status
config.status : creating Makefile.pre
config.status : creating Misc/python.pc
config.status : creating Misc/python-embed.pc
config.status : creating Misc/python-conf ig.sh
config.status: creating Modules/ld_so_aix
config.status : creating pyconfig.h
config.status : puconfig.h is unchanged
creating Modules/Setup . local
creating Makefile

可以看到第 5 行以及第 7 行结果都为yes,表示初始化脚本成功找到了需要链接的 openssl 库文件。请确保第 7 行为 yes 的结果。当然,检测到库文件之后就不会继续检测下去了,所以第 6 行这种正常是不会显示出来的。如果没有这个结果就进行下面的步骤只会被编译器狠狠地骂

1
2
3
4
5
./Modules/_ssl.c:56:10: fatal error: openss1/rsa.h: No such file or directory
56 | inc lude "openssl/rsa .h"
| ^~~~~~~~~~~~~~
compilation terminated.
make: *** [Makefile:1952: Modules/_ssl.o] Error 1

现在,可以开始编译了,这会花上一些时间。

1
make install

当出现下面内容时,表示 pip 已经编译好了。当然,版本不一定是一样的。

1
2
Installing collected packages: setuptools, pip
Successfully installed pip-21.1.1 setuptools-56.0.0

那 python 呢?pip 都好了那 python 肯定也好了啊(

安装 python

上一步我们编译好的 python 可执行文件默认会放在 /usr/local/bin 下,命名为 python3.8

1
ls -alF /usr/local/bin | grep python3
1
2
3
-rwxr-xr-x  1 root root 14732360 Jun 19 17:22 python3.8*
-rwxr-xr-x 1 root root 3053 Jun 19 17:23 python3.8-config*
lrwxrwxrwx 1 root root 16 Jun 19 17:23 python3-config -> python3.8-config*

同时我们可以查看原有的 python3 执行文件指向是什么。

1
ls -alf /usr/bin | grep python3
1
lrwxrwxrwx 1 root root       24 Jun 19 17:23 python3 -> /usr/local/bin/python3.8*

为了不影响原有的 python3 环境,这里我们删除 /usr/local/bin 下刚刚创建的 python3 软链接,当然别忘记 pip 的。

1
rm /usr/local/bin/puthon3 /usr/local/bin/pip3

同时使用 python38 以及 pip38 作为以后的运行命令,这里我们在 /usr/bin 创建软链接。

1
2
ln -s /usr/local/bin/python3.8 /usr/bin/py38
ln -s /usr/local/bin/pip3.8 /usr/bin/pip38

查看版本。

1
py38 --version && pip38 --version
1
2
3
Python 3.8.10
pip 21.1.1 from /usr/local/lib/python3.8/site-packages/pip (puthon 3.8)

恭喜,你已经成功编译并安装了一个 python!