当前位置: 首页 > news >正文

jenkins中执行python脚本导入路径错误

🧾 问题一:ModuleNotFoundError: No module named 'jenkins'

🔍 现象:

在本地运行正常,但在 Jenkins 中运行脚本时报错,提示找不到 jenkins 模块。

❓ 原因分析:

  • Python 默认只从当前目录或已安装包中查找模块。
  • Jenkins 执行脚本时的工作路径可能不是项目根目录。
  • from jenkins.config_manager import load_config 这种导入方式要求 Python 能找到 jenkins 目录,但默认情况下不会自动加入。

✅ 推荐解决方案:

方案一:在 Jenkins Pipeline 中设置 PYTHONPATH
bat '''@echo oncd /d "%WORKSPACE%"set PYTHONPATH=%WORKSPACE%.venv\\Scripts\\python.exe jenkins\\notification_sender.py
'''

⚠️ %WORKSPACE% 是 Jenkins 内置变量,指向任务的工作空间根目录。

方案二:在脚本中动态添加路径(适用于调试或临时使用)
import sys
import oscurrent_script_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.dirname(current_script_dir)
if project_root not in sys.path:sys.path.insert(0, project_root)from jenkins.config_manager import load_config

🧾 问题二:download_apk 路径不一致导致文件分散

🔍 现象:

下载目录一会出现在项目根目录下,一会出现在 jenkins/ 目录下,导致重复下载、清理混乱。

❓ 原因分析:

  • 使用了相对路径 os.getcwd(),而该函数返回的是当前执行命令所在的目录。
  • 如果从不同位置运行脚本,download_dir 的路径会不同。

✅ 推荐解决方案:

统一使用脚本所在目录定位 download_apk

代码如下:

# 获取当前脚本目录
current_script_dir = os.path.dirname(os.path.abspath(__file__))
download_dir = os.path.join(current_script_dir, "..", "download_apk")

这样无论你从哪里运行脚本,[download_apk]都会固定在项目根目录下。


✅ 总结:避免这些问题的最佳实践

问题最佳实践工具支持
模块导入错误 (No module named 'jenkins')设置 PYTHONPATH 或动态添加 sys.pathJenkins Pipeline + Python
下载目录路径不一致使用 __file__ 定位绝对路径Python 脚本内部处理

📌 最推荐的组合方案(Jenkins + Python)

Jenkinsfile 中的标准 bat 执行模板:

pipeline {agent anystages {stage('Run Script') {steps {script {bat '''@echo oncd /d "%WORKSPACE%"set PYTHONPATH=%WORKSPACE%.venv\\Scripts\\python.exe jenkins\\your_script.py'''}}}}
}

Python 脚本中标准路径处理逻辑:

import os
import sys# 获取当前脚本所在目录
current_script_dir = os.path.dirname(os.path.abspath(__file__))
# 添加项目根目录到 sys.path
project_root = os.path.dirname(current_script_dir)
if project_root not in sys.path:sys.path.insert(0, project_root)# 设置下载目录为项目根目录下的 download_apk
download_dir = os.path.join(project_root, 'download_apk')

📝 附加建议:

  1. 保持工作空间一致性
    • Jenkins 中尽量通过 cd /d "%WORKSPACE%" 固定工作目录。
  2. 使用虚拟环境
    • 使用 .venv 确保依赖隔离。
  3. 日志输出清晰化
    • 添加打印语句确认当前工作目录和模块路径:
      print("Current working dir:", os.getcwd())
      print("sys.path:", sys.path)
      

✅ os.path.dirname() 的常见用途:
获取当前脚本所在目录
os.path.dirname(os.path.abspath(file))
获取上级目录
os.path.dirname(current_script_dir)
构建相对路径
结合 os.path.join() 使用,构建跨平台兼容的路径

http://www.xdnf.cn/news/1070749.html

相关文章:

  • Chrome浏览器访问https提示“您的连接不是私密连接”问题解决方案
  • 【C++特殊工具与技术】固有的不可移植的特性(3)::extern“C“
  • 力扣第455场周赛
  • MATLAB 4D作图
  • Hyperledger Fabric 入门笔记(二十)Fabric V2.5 测试网络进阶之Tape性能测试
  • OpenCV模版匹配方法的衡量指标比较
  • 修复opensuse 风滚草rabbitmq的Error: :plugins_dir_does_not_exist问题
  • 【STM32】外部中断
  • 【Linux】基础开发工具(2)
  • java枚举enum的使用示例
  • 大厂测开实习和小厂开发实习怎么选
  • Java设计模式->责任链模式的介绍
  • [AI]从0到1通过神经网络训练模型
  • python+requests接口自动化测试
  • 《规则怪谈》合集
  • [特殊字符]️ 用 Python 绘制专业风玫瑰图:从气象数据到可视化的全流程指南
  • vscode ssh远程连接到Linux并实现免密码登录
  • Apipost和Postman对比
  • 缓存与加速技术实践-MongoDB数据库应用
  • 【RESTful接口设计规范全解析】URL路径设计 + 动词名词区分 + 状态码 + 返回值结构 + 最佳实践 + 新手常见误区汇总
  • Python打卡:Day37
  • 算法打卡 day4
  • Spring Boot 项目中同时使用 Swagger 和 Javadoc 的完整指南
  • Selenium+Pytest自动化测试框架实战
  • 快速傅里叶变换(FFT)是什么?
  • uniapp微信小程序:editor组件placeholder字体样式修改
  • GC 学习笔记
  • 新手向:Neo4j的安装与使用
  • ubuntu22.04系统kubeadm部署k8s高可用集群
  • Redis核心知识详解:从全局命令到高级数据结构