如何修复Digital Ocean Droplet中Python 3.6的SSL模块缺失问题
问题根因定位
- 你遇到的连锁报错本质是两个独立的运行环境错位:
- 你手动编译安装的Python 3.6在初始安装时没有绑定系统OpenSSL开发库,导致解释器内置的ssl模块缺失,所有pip发起的HTTPS请求都会被TLS校验拦截,触发SSL相关警告和重试失败。
- 你执行
django-admin --version返回的3.1.6版本,是全局系统路径下安装的Django,和你当前调用的python3.6解释器不属于同一套运行环境,因此才会出现命令行能识别django管理命令,但Python解释器找不到django模块的路径断层问题。
分步修复流程
1. 修复Python 3.6的SSL模块缺失
- 先安装编译Python 3.6依赖的全套系统库:
sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev
- 进入之前存放Python 3.6.0源码的目录,重新配置编译参数,明确关联系统OpenSSL路径:
cd /你的Python3.6源码存储目录 ./configure --enable-optimizations --with-openssl=/usr --with-ssl-default-suites=openssl make -j $(nproc) sudo make altinstall
注意:必须使用altinstall安装,不要用默认的install,避免覆盖系统自带的Python3软链,破坏系统原生工具的运行依赖。
- 安装完成后校验ssl模块状态,无输出报错即代表修复生效:
python3.6 -c "import ssl; print(ssl.OPENSSL_VERSION)"
2. 修正pipenv虚拟环境的解释器错配
- 进入项目根目录,删除之前创建的路径错位的旧pipenv虚拟环境:
cd /你的项目根目录 pipenv --rm
- 重新创建pipenv环境,强制绑定修复完成的Python 3.6解释器:
pipenv --python $(which python3.6)
- 激活虚拟环境后校验路径一致性:
pipenv shell which python python -V python -c "import sys; print(sys.executable)"
校验标准:返回的Python版本必须为3.6.0,解释器路径必须指向pipenv的虚拟环境目录,不能是系统全局的Python路径。
3. 对齐Django模块的环境匹配
- 保持pipenv虚拟环境激活状态,直接通过虚拟环境内的pip安装项目依赖,不要调用全局的
pip3.6/pip3:
pip install 你项目需要的Django版本号
- 验证模块加载状态:
python manage.py --version
无报错即代表当前环境模块路径完全对齐,后续执行makemigrations等管理命令不会再出现模块找不到的问题。
部署阶段的避坑提醒
- 激活pipenv虚拟环境后,不要刻意使用
python3.6、pip3.6这类带版本前缀的全局命令,这类命令会绕过虚拟环境的路径重定向,直接调用系统全局解释器,是出现路径错位的最常见原因。 - 后续配置gunicorn启动服务时,必须通过
pipenv run gunicorn调用虚拟环境内的服务,或者直接填写虚拟环境内gunicorn的绝对路径,不要使用全局安装的gunicorn,否则会再次出现解释器版本不匹配、找不到Django模块的报错。
内容的提问来源于stack exchange,提问作者FlamePrinz
相关产品推荐
相关产品推荐

