Ubuntu 18.04下Python3.6 venv路径异常致依赖加载失败问题
解决venv环境下sys.path缺失当前工作目录导致OpenSSL库加载失败的问题
我最近在Ubuntu 18.04上踩了个折腾2小时的坑,特意整理出来帮大家避坑——虽然我用的是Python3.6,但推测Python2.7也会遇到类似情况,先给大家还原下场景:
- 系统默认Python版本是2.7,为了匹配项目要求,我指定用Python3.6创建venv:在工作目录执行
python3.6 -m venv . - 接着用
pip install pyopenssl安装了依赖包 - 但按原有方式运行脚本(shebang写的是
#! /usr/bin/python3.6,执行./sslchecker.py)时,一直报无法加载OpenSSL库的错误 - 进入Python3.6交互环境执行
import sys后查看sys.path,发现路径里居然没有当前工作目录,这就是问题的核心!
问题原因分析
当你用python3.6 -m venv .把虚拟环境创建在当前目录时,venv的激活脚本会帮你配置好正确的PYTHONPATH和依赖路径,但如果你直接用系统级的/usr/bin/python3.6运行脚本(哪怕在venv目录下),相当于没激活虚拟环境:
- 从Python 3.3开始,当使用绝对路径执行解释器(比如
/usr/bin/python3.6),或者通过shebang指定绝对路径的解释器时,Python默认不会把脚本所在的工作目录自动加入sys.path - 这就导致venv里安装的pyopenssl依赖找不到,自然报错无法加载库
可行的解决方案
给大家提供三种解决思路,推荐前两种更规范的方式:
激活venv环境后再运行脚本
在工作目录执行激活命令(Ubuntu下):source bin/activate激活后终端会显示虚拟环境的名称(比如
(venv)前缀),这时候再执行./sslchecker.py,Python会自动加载venv内的依赖,sys.path也会包含正确的路径。修改脚本shebang指向venv内的Python解释器
把脚本开头的shebang改成:#! ./bin/python3.6这样执行
./sslchecker.py时,会直接调用虚拟环境里的Python解释器,自动识别当前环境的依赖路径,不用每次手动激活venv。临时手动添加路径(不推荐)
如果只是临时测试,可以在脚本开头手动把当前目录加入sys.path:import sys sys.path.insert(0, '.')这种方法不够优雅,容易引发其他路径问题,仅作为临时补救使用。
内容的提问来源于stack exchange,提问作者WeeDom
相关产品推荐
相关产品推荐

