qsub脚本中Python虚拟环境venv1无法调用问题排查与解决
问题原因分析
核心可能原因
- 虚拟环境bin目录缺少
python软链接:用/usr/local/bin/python3创建venv1时,其venv1/bin目录下可能仅存在python3可执行文件,未自动生成python到python3的软链接。而你的test.sh脚本中调用的是python a.py,激活venv1后PATH优先指向venv1/bin,因找不到python命令触发报错。
对比venv2:系统自带的/usr/bin/python3创建虚拟环境时,多数发行版会默认在venv的bin目录生成python软链接(系统本身通常存在python指向python3的全局设置),因此调用python可正常匹配。 - 作业环境PATH未包含
/usr/local/bin:qsub提交的作业可能运行在干净的隔离环境中,默认PATH未包含/usr/local/bin。若venv1的python软链接指向/usr/local/bin/python3,作业环境无法访问该路径时会导致命令找不到。不过该情况概率较低,毕竟同路径下的venv3(源码编译)可正常使用。
解决方法
方法1:修改脚本调用命令
直接将test.sh中的python a.py改为python3 a.py,激活venv1后,venv1/bin下的python3可被正常识别。
方法2:手动添加python软链接
在本地执行以下命令(无需通过qsub):
ln -s venv1/bin/python3 venv1/bin/python
完成后再用qsub提交脚本,调用python a.py即可正常运行。
方法3:创建venv时指定生成python链接
后续使用/usr/local/bin/python3创建虚拟环境时,可添加--symlinks参数确保软链接生成,并手动创建python链接:
/usr/local/bin/python3 -m venv --symlinks venv_new ln -s venv_new/bin/python3 venv_new/bin/python
方法4:手动补全PATH(兜底方案)
若以上方法无效,可在test.sh中激活venv1后,手动将/usr/local/bin添加到PATH最前端:
source venv1/bin/activate export PATH=/usr/local/bin:$PATH python a.py
内容的提问来源于stack exchange,提问作者user250756
相关产品推荐
相关产品推荐

