简介
本文将以两种方式安装 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
三个软链。
- 安装完 Python 后,默认会将新版 OpenSSL 加载至系统环境中,加载配置文件
快速安装
# 安装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 版本后修复此问题
解决方式
升级gcc至8.1.0【不推荐】
./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博客