CentOS Python 3.12安装
之前从来没想到我会在安装Python这点上卡住,事实上最近就是在一个CentOS测试机上安装Python时遇到了问题,因此记一下。
以往我们使用yum安装python时非常简单:
yum install python or yum install python3
最多额外再加装个pip以及python-devel,就算需要某个特定的、yum无法覆盖的小版本,也只需要`configure && make && make install`就完事,毕竟其依赖与默认的python基本相似。
然而随着python版本的快速更迭,老旧的CentOS6、7系统自带的yum源已经无法覆盖新的python版本,其上许多依赖也已过时,这就需要我们手动编译安装python。
1、openssl的问题
ssl是python的核心模块依赖之一,pip工具、安全加密等功能依赖于此。
在CentOs6、7安装Python高版本时,所需的openssl版本高于系统默认的openssl 1.0.2k,因此我们需要到 https://github.com/openssl/openssl/tags 下载对应的openssl安装包,解压后进行编译安装:
cd openssl-1.1.1w ./config --prefix=/usr/local/openssl make make install ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl # 覆盖原先的openssl(也可以先备份下原先的openssl指令),无需担心yum/ssh等工具失效,这些工具使用的是/usr/lib64中的.so库,不是这个openssl指令 echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/openssl/lib">>/etc/profile source /etc/profile openssl version # 验证新的openssl版本
需要特别注意的是:openssl建议使用--prefix的方式进行config,即在/usr/local目录下使用单独的子目录进行安装,否则python make时可能无法识别使用(或许需要指定--with-openssl=/usr/local)。
2、readline/zlib等等依赖缺失怎么办?
除了比较重要的ssl之外,还会有一些Python标准库可能因为依赖缺失而在make时报出missing警告,虽然这样make出来的python也能用但遇到需要使用这些特定包时就会有问题,因此提前安装有必要。
具体需要安装哪些包需要根据make的结果来看,可以先按下述语句安装一下,然后根据make结果再安装其他缺失的依赖。
yum -y groupinstall "Development Tools" yum -y install bzip2-devel gdbm-devel xz-devel readline-devel ncurses-devel tk-devel libuuid-devel libffi-devel sqlite-devel
最后进行python编译安装:
https://www.python.org/downloads/ 下载所需Python版本。
解压后执行如下操作:
cd Python-3.12.4 ./configure --prefix=/usr/local/python3.12 --with-openssl=/usr/local/openssl --enable-loadable-sqlite-extensions # 加prefix的作用是把python安装到/usr/local/python3.12目录下而非默认的/usr/local目录下,类似于解压到当前目录和解压到指定目录的区别,不过默认的/usr/local下组织的也很合理,因此不加也行 # 指定--prefix后,python的bin,lib等目录等会全部集中在/usr/local/python3.12目录下,未指定时则直接位于/usr/local目录下 # --with-openssl建议加上,这个参数指定的是openssl的安装根目录,在使用非默认ssl组件时很有用 # --enable-loadable-sqlite-extensions是为安装_sqlite模块,ipython会用到 make make install ln -s /usr/local/python3.12/bin/python3.12 /usr/bin/python3
再补充一个pypi源的配置:
在国内使用pypi拉取安装包通常比较慢,所以我们通常会使用BAT三家的pypi源:
vi ~/.config/pip/pip.conf # 也可以用:~/.pip/pip.conf # Windows下路径为 C:\Users\%USERNAME%\AppData\Roaming\pip\pip.ini, 或全局配置路径:C:\ProgramData\pip\pip.ini # 使用pip config list验证配置是否已生效
[global] index-url = https://mirrors.aliyun.com/pypi/simple/ extra-index-url = https://mirror.baidu.com/pypi/simple https://mirrors.tencent.com/pypi/simple/ timeout = 3 trusted-host = mirrors.aliyun.com mirror.baidu.com mirrors.tencent.com root-user-action = ignore
多源分隔符为换行符。
来自chatgpt的回复(未验证):从 pip 21.x 开始(尤其是 21.3 和更新的版本),pip在处理多个索引源时进行了改进,能够并行查询所有配置的镜像源以加速包安装过程,当在所有源中拉取到了相关包时使用最后一个进行安装。
目前的感触是腾讯的pip源速度比较快比较全,当然也和我把他放在最后有关系。