1. Linux下载python源码包
- 官方下载地址 根据需求,选择合适的版本进行下载
- 我们这里选用 https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
2. 解压
tar -xzvf Python-3.7.1.tgz
#也可以使用tar xvf *.tar -C 自定义目录指定解压位置。
#若文件为.tgz格式,用mv命令转成.tar.gz
mv Python-3.7.0.tgz Python-3.7.0.tar.gz
tar xvf Python-3.7.0.tgz
3. 编译安装
configure是一个shell脚本,根据平台的特性生成Makefile文件,为下一步的编译做准备。可以通过在 configure 后加上参数来对安装进行控制,比如下面就是指定安装目录/usr/local/python3。如果没有用这个选项,安装过程结束后,该软件所需的软件被复制到不同的系统目录下,比较混乱。
cd Python-3.7.0
./configure --prefix=/usr/local/python3 --with-ssl
make && make install
make clean # 删除一些临时文件(删除源代码(C\C++ code)生成的执行文件和所有的中间目标文件)
3.1. configure说明
./configure --prefix=/usr/local/python3 --with-ssl
"--enable-optimizations"这个参数会启用配置文件引导的优化(PGO)和链接时间优化(LTO)。两者都是昂贵的优化,会减慢构建过程,但会显着提高速度(我记得阅读的内容大约有10-20%)。
./configure --enable-optimizations --prefix=/usr/local/python3
3.2. make编译make install安装
- 如果有需要,会进行 make depend(一种makefile的规则,通过扫描一个目录下的所有C\C++ 代码,从而判断出文件之间的依赖关系,如a.cc文件中调用了b.h(如以形势include<b.h>),如果之后a.cc文件被改动,那么只需要重新编译a.cc文件,不需要编译b.h文件。否则所有的文件都需要重新编译)
从Makefile中读取指令,根据makefile制定的规则,将c\c++文件编译成*.o文件,然后进一步生成可执行文件。大多数的源代码包都经过这一步进行编译,(当然有些perl或python编写的软件需要调用perl或python来进行编译)。
make && make install
注意:如果 在make过程中出现 error ,你就要记下错误代码(注意不仅仅是最后一行),然后你可以向开发者提交 bugreport(一般在 INSTALL 里有提交地址),或者你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。
3.3. 更改系统默认版本
之前查看版本使用 /usr/local/lib/python2.7 -V,现在来把系统默认的Python指向刚才安装的Python2.6。
# 进行软连接
ln -s /usr/local/bin/python3.7 /usr/bin/python
ln -s /usr/local/python3.7/bin/pip3 /usr/bin/pip3
# mv /usr/local/bin/pip3 /usr/local/bin/pip3.bak
ln -s /usr/local/python3.7/bin/pip3 /usr/local/bin/pip3
# 如果执行失败,查看是否已存在 , 则执行
# rm -f /usr/bin/python
#查看版本号是否更换成功
python -V
4. 遇到问题总结
4.1. zlib import error
sudo yum install zlib-*
4.2. 报错ModuleNotFoundError: No module named '_ctypes'的解决办法
yum install libffi-devel
#从"./configure ..."重新安装
4.3. pip3 install时报错“pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.”
先安装openssl-dev,然后重新编译安装,只是在编译的过程中加入 --enable-optimizations