2021年如何在Python 2.7环境安装pip并解决PyPI非SNI兼容问题
可行解决方案
方案1:临时修复SNI支持(适合单用户临时使用)
- 先安装系统层面的基础依赖:
apt-get update && apt-get install -y python-dev libssl-dev libffi-dev
- 预先在可正常访问外网的设备上,下载好以下支持Python2.7的旧版本安装包,放入Docker构建上下文的本地目录:
- 最后一个支持Python2.7的pip安装脚本
get-pip.py(对应2.7分支版本) - pip 20.3.4安装包
- urllib3、pyOpenSSL、ndg-httpsclient、pyasn1对应兼容Python2.7的版本包
- 最后一个支持Python2.7的pip安装脚本
- 进入legacy环境后,本地离线安装pip:
python2 get-pip.py pip==20.3.4 --no-index --find-links=./本地包存放目录路径
- 再离线安装urllib3的安全依赖补齐SNI支持:
pip install "urllib3[secure]" --no-index --find-links=./本地包存放目录路径
- 完成上述配置后,环境已支持SNI,可正常访问公网PyPI安装其他依赖包
注意:不要升级系统自带的Python2.7.6版本,避免和生产环境运行版本不一致,出现兼容性问题
方案2:搭建内部私有PyPI源(适合团队长期维护legacy开发环境)
该方案稳定性更高,不会受公网PyPI规则变动影响,适合多人开发场景:
- 在内网服务器部署devpi或pypiserver作为私有PyPI源,一次性同步所有legacy环境需要的Python包的指定版本
- 在Ubuntu 14.04构建镜像的pip配置文件
/etc/pip.conf中,默认指定内部私有源地址,所有包安装请求都走内网,不需要支持SNI即可正常拉取 - 将所有依赖包的版本锁死在requirements.txt中,全部同步到私有源后,后续构建不需要再访问公网PyPI
- 可将配置完成的基础镜像上传到内部镜像仓库,新开发者直接拉取镜像即可使用,不需要重复执行依赖安装流程
内容的提问来源于stack exchange,提问作者Jonathan Rys
相关产品推荐
相关产品推荐

