Install Python from source release
从源码安装 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
现在,可以开始编译了,这会花上一些时间。
当出现下面内容时,表示 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/py38ln -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!