CentOS系统安装Python-3.7.11及OpenSSL-1.1.1


简介

本文将以两种方式安装 Python3、PiP3及虚拟环境(virtualenv)


手动安装

准备环境

安装依赖

libffi-devel 一定要装,否则报错 No module named '_ctypes' .

yum install gcc zlib-devel make libffi-devel -y

升级OpenSSL

如果仅安装 Python2 可以选择忽略该步骤。

为 Python3 单独升级 openssl;为了避免与系统已有 openssl 冲突,因此安装到其他路径:

wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz --no-check-certificate

tar -zxvf openssl-1.1.1k.tar.gz

cd openssl-1.1.1k

./config --prefix=/usr/local/openssl-1.1.1 --openssldir=/usr/local/openssl-1.1.1 

make && make install

# 方法一,声明临时变量,怕影响线上服务推荐使用该方法
# 包括后续引用库文件都要提前声明
export LD_LIBRARY_PATH=/usr/local/openssl-1.1.1/lib:$LD_LIBRARY_PATH

# 方法二,永久声明变量
echo "/usr/local/openssl-1.1.1/lib" >> /etc/ld.so.conf.d/openssl-1.1.1-x86_64.conf

ldconfig

安装Python

Python2

以安装 Python-2.7.18 为例。

wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tar.xz
tar xf Python-2.7.18.tar.xz
cd Python-2.7.18
sudo ./configure --prefix=/usr/local/python-2.7.18 --enable-optimizations
sudo make && sudo make install

sudo ln -s /usr/local/python-2.7.18 /usr/local/python2.7
sudo ln -s /usr/local/python-2.7.18/bin/python2.7 /usr/bin/python2.7
安装 pip2
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
sudo python2.7 get-pip.py

Python3

以安装 Python-3.7.11 为例。

下载源码

下载 Python 版本

wget https://www.python.org/ftp/python/3.7.11/Python-3.7.11.tar.xz
tar xvf Python-3.7.11.tar.xz
编译安装

解压缩、编译和安装

cd Python-3.7.11

sudo ./configure --prefix=/usr/local/python-3.7.11 --enable-optimizations --with-openssl=/usr/local/openssl-1.1.1

sudo make && sudo make install
更新环境

做个软连接到当前用户的 bin 目录

ln -s /usr/local/python-3.7.11 /usr/local/python3
ln -s /usr/local/python-3.7.11/bin/python3.7 /usr/bin/python3
ln -s /usr/local/python-3.7.11/bin/pip3 /usr/bin/pip3

升级安装好新版本 Python 以后,需要将工程文件 Python2.6 的文件头部 #!/usr/bin/python 修改为 Python3 的路径,例如: #!/opt/python3/bin/python3

扩展说明: 假设要安装3.8.5,可参考如下:

export PYTHON_VERSION="3.8.5"

cd /usr/local/src
wget https://www.python.org/ftp/python/$PYTHON_VERSION/Python-$PYTHON_VERSION.tar.xz
tar xf Python-$PYTHON_VERSION.tar.xz
cd Python-$PYTHON_VERSION/
./configure --prefix=/usr/local/python-$PYTHON_VERSION --enable-optimizations --with-openssl=/usr/local/openssl-1.1.1
make -j `cat /proc/cpuinfo | grep -i "model name" | wc -l` && make install

ln -s /usr/local/python-3.8.5/bin/python3.8 /usr/bin/python3.8
ln -s /usr/local/python-3.8.5/bin/pip3 /usr/bin/pip3.8
安装 pip3 和 easy_install

安装完检查下服务器上面是否有了 pip3 命令和 easy_install-3.6 如果没有的话按以下步骤安装。

# 下载setuptools,easy_install 的安装包
wget https://bootstrap.pypa.io/ez_setup.py --no-check-certificate

# 安装easy_install
# 记得用python3安装
python3 ez_setup.py

#安装完成后/usr/local/bin/目录下出现easy_install
#安装pip3
easy_install-3.6 pip

#安装完成后/usr/local/bin/目录下出现pip3.6
#升级pip3.6版本
pip3 install --upgrade pip
检查openssl版本

通过终端检查

# 从终端进入python
python

>>> import ssl
>>> ssl.OPENSSL_VERSION
>>> 'OpenSSL 1.1.1k  25 Mar 2021'

通过脚本检查

#!/usr/bin/python3
# -*- coding: UTF-8 -*-

import ssl

print(ssl.OPENSSL_VERSION)

一键脚本安装

简要说明

该脚本默认是基于 OpenSSL-1.1.1 来安装 3.7.11 版本的 Python 。

源码包目录,默认位于执行脚本当前目录的 packages 中。( 如有自定义路径需求,请修改脚本中 packages_dir 变量。 )

安装目录,默认分别位于 /usr/local/openssl-1.1.1k/usr/local/python-3.7.11 中。 ( 脚本内写死 )

虚拟环境目录,默认位于 /data1/virtualpython 目录下。 ( 脚本内写死 )

  • 对于环境变量的改变:
    • 安装完 Python 后,默认会将新版 OpenSSL 加载至系统环境中,加载配置文件 /etc/ld.so.conf.d/openssl-1.1.1k-x86_64.conf
    • 安装完 Python 后,默认会添加 /usr/local/python3/usr/bin/python3/usr/bin/pip3 三个软链。

快速安装

# 安装Python3及PiP3
source <(curl -sL https://github.com/nestealin/python3-installer/releases/download/v1.0.0/py3_auto_install.sh) -d

# 安装Python3,同时安装并配置虚拟环境
source <(curl -sL https://github.com/nestealin/python3-installer/releases/download/v1.0.0/py3_auto_install.sh) -v

脚本内容

如果脚本下载困难,可以通过如下脚本复制粘贴使用。

详见: Python3及虚拟环境(virtualenv)一键安装脚本(含升级OpenSSL-1.1.1)


可能遇到的问题

1.pip安装提示SSL报错

报错信息如下

WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping

手动在 Python 中引入 ssl 模块也会有如下报错

# /usr/local/python-3.7.11/bin/python3
Python 3.7.11 (default, Nov 20 2022, 21:58:43)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-23)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/python-3.7.11/lib/python3.7/ssl.py", line 98, in <module>
    import _ssl             # if we can't import it, let the error propagate
ImportError: libssl.so.1.1: cannot open shared object file: No such file or directory

原因是安装时引入了非系统原生版本的openssl依赖库,需要手动声明环境变量,或写入系统中

方法一

# 方法一,声明临时变量,怕影响线上服务推荐使用该方法
# 包括后续执行python、引用库文件前都要提前声明
export LD_LIBRARY_PATH=/usr/local/openssl-1.1.1/lib:$LD_LIBRARY_PATH

方法二

# 方法二,永久声明变量
echo "/usr/local/openssl-1.1.1/lib" >> /etc/ld.so.conf.d/openssl-1.1.1-x86_64.conf

ldconfig
  • 配置后建议检查并修复:

TODO

2.编译 Python-3.8.X 时出现 Could not import runpy module 报错

异常现象

Could not import runpy module
Traceback (most recent call last):
  File "/root/0tmp/Python-3.8.16/Lib/runpy.py", line 15, in <module>
    import importlib.util
  File "/root/0tmp/Python-3.8.16/Lib/importlib/util.py", line 14, in <module>
    from contextlib import contextmanager
  File "/root/0tmp/Python-3.8.16/Lib/contextlib.py", line 4, in <module>
    import _collections_abc
SystemError: <built-in function compile> returned NULL without setting an error
generate-posix-vars failed
make[1]: *** [pybuilddir.txt] Error 1
make[1]: Leaving directory `/root/0tmp/Python-3.8.16'
make: *** [profile-opt] Error 2

原因

  • 在低版本的gcc版本中带有 --enable-optimizations 参数时会出现上面问题
  • 在 gcc 8.1.0 版本后修复此问题

解决方式

  1. 升级gcc至8.1.0【不推荐】

  2. ./configure 参数中去掉 --enable-optimizations

    cd $PYTHON_PACKAGE_PATH
    make clean
    ./configure --prefix=/usr/local/python-3.8.16 --with-openssl=/usr/local/openssl-1.1.1
    make && make install

参考文档: python 3.8.0 编译报错 Could not import runpy module 解决方案_whatday的博客-CSDN博客


文章作者: NesTeaLin
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 NesTeaLin !
  目录