🧾 问题一: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.pswp.cn/web/86617.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86617.shtml
英文地址,请注明出处:http://en.pswp.cn/web/86617.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为云Flexus+DeepSeek征文 | 华为云ModelArts Studio实战指南:创建高效的AingDesk知识库问答助手

华为云FlexusDeepSeek征文 | 华为云ModelArts Studio实战指南:创建高效的AingDesk知识库问答助手 前言一、ModelArts Studio介绍1. 华为云ModelArts Studio简介2. 华为云ModelArts Studio主要特点3. 华为云ModelArts Studio主要使用场景 二、AingDesk介绍1. AingDes…

NLP基础1_word-embedding

基于github项目:https://github.com/shibing624/nlp-tutorial/tree/main 自然语言处理任务 1) 简单任务 拼写检查 Spell Checking 关键词检索 Keyword Search 同义词查找 Finding Synonyms 2) 中级任务 解析来自网站、文档等的信息 3) 复杂任务 机器翻译 Ma…

ClickHouse系列--BalancedClickhouseDataSource实现

clickhouse-jdbc中负载均衡数据源的实现。 基本逻辑如下: 1.通过配置的url串,来切分构造url列表; 2.通过一个定时线程任务,来不断的去ping url列表,来更新可用的url列表; 3.在可用列表中随机返回一个可用ur…

Linux目录说明

Linux Filesystem Hierarchy Standard(FHS) 1. /bin 全称:Binary(二进制文件)功能:存放系统最基础的可执行命令,所有用户(包括普通用户)都能使用,用于系统启…

鸿蒙 Grid 与 GridItem 深度解析:二维网格布局解决方案

一、引言:网格布局 —— 多维度数据展示的黄金方案 在鸿蒙应用开发体系中,网格布局作为处理多元素有序排列的核心方案,广泛应用于电商商品陈列、图片画廊、功能矩阵等场景。鸿蒙提供的 Grid 与 GridItem 组件通过声明式语法构建灵活的二维布…

​​Vue 开发环境配置:使用 devServer.proxy 解决跨域问题​-vue中文件vue.config,js中配置devserver做反向代理到后端

​​Vue 开发环境配置:使用 devServer.proxy 解决跨域问题​​ ​​引言​​ 在现代 Web 开发中,前端和后端通常独立开发,前端运行在 http://localhost:8080,而后端可能运行在 http://localhost:8000 或其他端口。由于浏览器的 …

JVM 中的 GC 算法演进之路!(Serial、CMS、G1 到 ZGC)

引言 想象一下,Java 程序运行就像在一个巨大的图书馆里借书还书。这个图书馆(JVM 的内存堆区)为了高效运转,需要一个聪明的“图书管理员”来清理失效的书籍(垃圾对象)。这,就是垃圾回收器&#…

(9)python+playwright自动化测试-页面(page)

1.简介 通过前边的讲解和学习,细心认真地你可能发现在Playwright中,没有Element这个概念,只有Page的概念,Page不仅仅指的是某个页面,例如页面间的跳转等,还包含了所有元素、事件的概念,所以我们…

《自动控制原理 》- 第 1 章 自动控制的基本原理与方式

1-1 自动控制的基本原理与方式 自动控制是指在没有人直接参与的情况下,利用外加的设备或装置,使机器、设备或生产过程的某个工作状态或参数按照预定的规律运行。自动控制的核心原理是反馈控制,即通过将系统的输出量回送到输入端,与…

DL00715-基于YOLOv11的水面漂浮物目标检测含数据集

【论文必备】基于YOLOv11的水面漂浮物目标检测——让你的研究走在科技前沿! 在环境监测、海洋保护和水质管理领域,水面漂浮物的检测一直是一个亟待解决的难题。传统的人工巡检方式不仅耗时费力,还无法覆盖广泛的水域范围。如今,基…

权电阻网络DAC实现电压输出型数模转换Multisim电路仿真——硬件工程师笔记

目录 1 基础知识 1.1 运算放大器在DAC中的作用 1.2 常见的基于运算放大器的DAC电路 1.2.1 倒T形电阻网络DAC 1.2.2 权电阻网络DAC 1.2.3 开关电容DAC 1.3 运算放大器的选择 1.4 设计注意事项 2 仿真实验 2.1 权电阻网络DAC实现数字0对应电压输出 2.2 权电阻网络DAC实…

Redis主从集群

✅ 一、什么是 Redis 主从集群? Redis 主从(Master-Slave)集群是一种最基础的集群方式: 一台 Redis 作为主节点(Master),负责写操作; 一到多台 Redis 作为从节点(Slave&…

【水印论文阅读1】将水印规则的定义域从离散的符号空间转移到连续的语义空间

【水印论文阅读1】将水印规则的定义域从离散的符号空间转移到连续的语义空间 写在最前面**为什么“token序列空间”有根本缺陷?****为什么“语义向量空间”能破局?****1. 连续性(抗攻击的核心)****2. 高维复杂性(防破解…

Glide缓存机制

一、缓存层级与设计目标 双级缓存: 内存缓存:弱引用 LruCache 磁盘缓存:DiskLruCache 设计目标: 减少网络流量消耗 避免Bitmap频繁创建/销毁引发的GC 提升图片加载速度 二、内存缓存机制 1. 双缓存结构 缓存类型存储对象…

BaiduSitemap - Typecho站点地图生成与多搜索引擎推送插件

文章目录 🌐 BaiduSitemap - Typecho站点地图生成与多搜索引擎推送插件✨ 功能特点🧩 插件架构核心模块文件结构📦 安装方法方法一:手动安装方法二:Git克隆⚙️ 配置说明站点地图基本设置搜索引擎配置百度搜索引擎必应(Bing)搜索引擎谷歌(Google)搜索引擎🚀 使用…

androidx中<layout>根布局的意义及用法

在 Android 开发中,<layout> 根布局是 Android Jetpack Data Binding 库的核心组件,用于声明该 XML 布局文件将使用数据绑定功能。以下是详细说明: 📌 一、基本作用 1. 启用数据绑定 <layout> 标签标志着此布局文件支持数据绑定,编译器会为其生成对应的绑定类…

QTreeWidget 简单使用

效果图&#xff1a; 关键代码&#xff1a; void MainProj::_InitTree() { connect(m_pTreeWidget, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(TreeItemClicked(QTreeWidgetItem*, int))); m_pTreeWidget->header()->setHidden(1); /*QTreeWid…

手势-handpose的pipeline介绍

手势-handpose的pipeline包括&#xff1a; 1、手部检测算法&#xff1a;单帧检测出左右手的边界框。 2、手部跟踪算法&#xff1a;连续帧跟踪&#xff0c;锁定左右手跟踪目标&#xff0c;作为后续的手部ui操作。 3、手部关键点检测算法&#xff1a;基于单帧的检测框图像作为输…

计算机操作系统(十七)内存管理

计算机操作系统&#xff08;十七&#xff09;内存管理 前言一、内存的使用与程序重定位&#xff08;一&#xff09;内存是什么&#xff1f;&#xff08;二&#xff09;程序的重定位过程&#xff08;三&#xff09;总结&#xff1a;内存使用的核心问题 二、连续分区管理&#xf…

【编译原理】期末

单选题 (4分) 令文法G[E]为&#xff1a;E->ET | T T->T*F | F F-> (E) | i 句型 F*iT 的最左素短语是&#xff08; &#xff09; A.F B.i C.T D.F*i B 短语&#xff1a; F*iT、F*i、F、i 素短语&#xff1a; i 最左素短语&#xff1a; i 单选题 (4分) 若在…