通过shell脚本运行Python文件报ModuleNotFoundError的问题
故障原因
- 核心触发点是
sudo命令的环境变量重置机制:你预先激活的虚拟环境仅作用于当前普通用户的shell会话,执行sudo后会切换到root用户的执行上下文,默认会重置PATH等环境变量,使用系统全局的python3解释器,而非虚拟环境中的解释器。 - 你通过
pip list查看到的opc 0.8.0仅安装在当前激活的虚拟环境中,系统全局Python环境并未安装该依赖,因此脚本执行时会报模块不存在的错误。 - 直接执行
python3 scripts/download.py无报错,是因为此时调用的是虚拟环境内的Python解释器,能正确识别虚拟环境中安装的依赖包。
解决方案
方案1(优先推荐):去掉sudo执行
如果你的build.sh不需要root权限即可完成所有操作,直接执行以下命令即可,此时会继承当前shell的虚拟环境配置:
sh scripts/src/build.sh
如果执行过程中出现权限不足的提示,可先给对应操作目录赋权:
chmod -R 755 /home/ray/Desktop/repo/image-builder
方案2:指定虚拟环境Python的绝对路径
先在已激活虚拟环境的shell中执行which python3,获取虚拟环境Python解释器的绝对路径,示例输出为/home/ray/your_venv_path/bin/python3。
修改build.sh中的调用语句,将python3替换为刚才查到的绝对路径:
/home/ray/your_venv_path/bin/python3 $(pwd)/scripts/download.py -d $dir_name
如果必须使用sudo执行,可加上-E参数保留当前用户的环境变量:
sudo -E sh scripts/src/build.sh
方案3:在build.sh内主动激活虚拟环境
在build.sh的开头添加虚拟环境激活语句,替换为你自己的虚拟环境activate路径即可:
#!/bin/bash # 开头新增激活语句 source /home/ray/your_venv_path/bin/activate # 后续原有脚本逻辑保持不变 python3 $(pwd)/scripts/download.py -d $dir_name
内容的提问来源于stack exchange,提问作者ray an
相关产品推荐
相关产品推荐

