从Jenkins运行Django项目Python脚本时出现ModuleNotFoundError错误
解决Jenkins执行Python脚本时找不到Django模块的问题
问题根源
直接在服务器上运行脚本正常,但Jenkins触发时提示ModuleNotFoundError: No module named 'django',核心原因有两个:
- Jenkins默认使用
jenkins系统用户的环境,和你手动执行时的用户环境(比如root或个人用户)的Python包路径完全不同 - 你写的Shell脚本里
export PYTHONPATH=/lib/python3.9/是错误操作:这个路径是Python标准库目录,不是第三方包(比如Django)的安装路径,而且直接覆盖PYTHONPATH会清空原有包搜索路径,反而导致找不到已安装的模块
解决方法(按推荐程度排序)
方法1:使用虚拟环境(最稳妥)
如果你手动运行时用了虚拟环境,直接在Shell脚本里激活虚拟环境再执行脚本:
#!/bin/bash # 替换成你实际的虚拟环境路径 source /path/to/your/virtualenv/bin/activate # 激活后直接用python即可,不用指定版本(虚拟环境里的解释器已关联) python <full_script_path>/import_mantis.py # 可选:执行完退出虚拟环境 deactivate
如果没用到虚拟环境,建议先给脚本创建专属虚拟环境,避免依赖冲突。
方法2:指定安装了Django的Python解释器路径
手动执行以下命令,找到你正常运行脚本时用的Python解释器路径:
which python3.9
比如得到输出/home/your_user/.local/bin/python3.9或者/usr/local/bin/python3.9,然后修改Shell脚本:
#!/bin/bash # 替换成上面得到的实际路径 /home/your_user/.local/bin/python3.9 <full_script_path>/import_mantis.py
方法3:正确添加PYTHONPATH(不推荐,易出问题)
先找到Django所在的site-packages目录:
python3.9 -c "import django; print(django.__file__)"
比如输出/usr/local/lib/python3.9/site-packages/django/__init__.py,那么site-packages路径就是/usr/local/lib/python3.9/site-packages。然后修改脚本,把这个路径追加到PYTHONPATH(不是覆盖):
#!/bin/bash export PYTHONPATH="$PYTHONPATH:/usr/local/lib/python3.9/site-packages" python3.9 <full_script_path>/import_mantis.py
验证步骤
可以在Jenkins的Shell执行步骤里先加一行命令,确认Jenkins用户的Python环境里有没有Django:
python3.9 -m pip list | grep django
如果没有输出,说明Jenkins用户的环境确实没装Django,这时候用方法1或方法2最直接。
内容的提问来源于stack exchange,提问作者Jules SMITHSON
相关产品推荐
相关产品推荐

