写在前面
Linux上配置Python3的教程已经烂大街了,随便搜搜都一大堆,但是都0202年了,竟然没有什么教程能够完整介绍安装完全版Python的流程,装的全是残缺版的,结果一跑程序就显示“No Module name xxx”,发现少装了东西,重新安装后又把Python编译个十遍八遍,效率极其低下。
本文就从刚拿到一台Centos7服务器开始,讲述配置完整版Python的流程。
文章目录
准备阶段
Linux配置Python一般使用源码编译安装的方式,最万能也最坑,那么在开始前可以首先使用
sudo yum -y update # 可以不做
先更新下,升级所有包同时也升级软件和系统内核,如果担心系统内核发生变化可以不执行该命令,接下来安装一些工具
sudo yum groupinstall -y 'Development Tools'
sudo yum install -y gcc openssl-devel bzip2-devel libffi-devel sqlite-devel
其中
- Python得靠gcc编译
openssl-devel
是配合openssl
在Python的ssl
模块发挥作用的,如果不装会报错No module named _ssl
libffi-devel
如果不装的话,会报错No module named '_ctypes'
sqlite-devel
如果不装的话,会报错No module named _sqlite3
如果没有特殊情况还是装一下,虽然不装也能用,但是何乐而不装呢?
在这个阶段使用yum
安装会出现一些问题,我这里总结了一个
[Errno 14] HTTP Error 404 - Not Found
可以先尝试这两个命令
sudo yum clean all
sudo rpm --rebuilddb
如果还是不管用的话,可能是yum
源失效,这边建议先更换一下国内的yum
源:执行这篇文章里的Yum换源推荐步骤即可
第一步 => 升级openssl
如果你的Python模块不需要使用_ssl
模块的话,其实可以直接去看第二步,但是但凡你的Python程序涉及到对Web的请求,比如说socket
或者小爬爬等,建议还是走完第一步再走第二步。为什么我们要升级openssl
呢?因为Centos7自带的时间太久远了,比较新的Python版本用的是更新的openssl
库了,你可以输入
openssl version
来查看你的openssl
版本,如果你的版本是1.1.1以下的,建议都对其进行升级,所以我们到openssl的github上面来下载最新的版本,也可以使用
wget http://github.com/openssl/openssl/archive/OpenSSL_1_1_1g.tar.gz # 我目前最新版本是1.1.1g
tar -xvf OpenSSL_1_1_1g.tar.gz
来直接下载到服务器上并进行解压,解压之后来到解压好的目录
./config --prefix=/usr/local/openssl # -prefix指定安装的路径,一定一定要指定!不然安装后生成的文件不全
make -j24 # 多核心加快编译
sudo make install
这时候我们的新版openssl
就安装好了,我们可以通过命令
whereis openssl
查看在/usr/local/openssl
(你刚才–prefix指定的路径)下是否有openssl
,之后我们需要使用新的openssl
对旧的进行替换
sudo mv /usr/bin/openssl /usr/bin/openssl.old # 先备份一下旧的,可以通过上条命令找出所有openssl位置
sudo mv /usr/lib64/openssl /usr/lib64/openssl.old # 我是64位系统所以都在lib64文件夹下
sudo mv /usr/lib64/libssl.so /usr/lib64/libssl.so.old # 你需要注意你的openssl是在lib文件夹下还是在lib64文件夹下
之后给我们安装位置的openssl
创建一个软连接,注意连接的时候一定要使用绝对路径,不然会出现符号链接层数太多的问题
# ln -s 你prefix指定的路径/bin/openssl /usr/bin/openssl
# ln -s 你prefix指定的路径/include/openssl /usr/include/openssl
# ln -s 你prefix指定的路径/lib/libssl.so /usr/lib64/libssl.so
sudo ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl # 我安装在/usr/local/openssl下
sudo ln -s /usr/local/openssl/include/openssl /usr/include/openssl
sudo ln -s /usr/local/openssl/lib/libssl.so /usr/lib64/libssl.so
这时候不要着急,还有两个openssl需要使用的库没有连接过去,可以使用命令
ldd /usr/local/openssl/bin/openssl
如果遇到了下图的情况,但凡出现not found就说明库没有连接好
这时候我们需要把这两个库连接过去就可以了
sudo ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
sudo ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
这时候再执行ldd
指令会发现所有的库都找到了
这时候输入openssl version
查看下版本:
已经是最新的了,到此openssl
升级完成
第二步 => 安装Python
我们直接从Python官网选择相应的版本下载源码点这里
或者
wget https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tar.xz
tar -xvf Python-3.8.5.tar.xz # 解压
进入解压后的目录后,我们需要做一些修改
cd Modules/
vim Setup
找到下图所在的位置,把这四行的注释打开(大概在57%处,或者直接用输入/ssl
进行搜索)
第一行把SSL=
后面的路径改成openssl
安装的路径,之后回到Python源码目录
./configure --prefix=/usr/local/python3 # 指定你安装的Python位置,建议在/usr/local下
make -j24
sudo make install
这样我们的Python就安装好了,还需要做最后的配置,没错,软链接~
sudo ln -s /usr/local/python3/bin/python3 /usr/bin/python3
sudo ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
现在我们已经可以在控制台使用python3
这个指令了
可以发现此时在里面导入ssl
模块和sqlite3
时不会报错
Error in `./python’: free(): invalid next size (fast)
这里我介绍一下这个不常见的错误,很不幸被我遇到了,这个问题是在make
Python的时候出现的,这说明Python没有编译成功,其中free()
指针指向了不该指的内存单元,而这个错误是来自于openssl
的,如果你也不幸遇到了这种情况,建议卸载干净之后重新安装openssl
,或者直接重装系统。