当前位置: 首页 > 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.lqws.cn/news/544789.html

相关文章:

  • 跟着AI学习C#之项目实战-电商平台 Day3
  • 《聊一聊ZXDoc》之汽车服务导向SOME/IP
  • 自动登录脚本神器-Mac电脑实现自动登录堡垒机并自动输入账号密码跳转不同机器环境
  • uniapp处理后端返回的html字符串
  • spring-security-oauth2系列:自定义认证服务器
  • 为什么python处理csv文件将某个值替换成另一个值并另存后,csv文件的大小减小了一半
  • Nginx 与 Apache:有什么区别?哪种服务器最适合您?
  • 【数据挖掘】数据采集和预处理
  • 如何确保京东商品数据采集的准确性和及时性?
  • 【lua】Linux上安装lua和luarocks包管理工具
  • 提升AI准确性的关键:精准添加上下文
  • 【NodeJs】【npm】npm安装electron报错
  • Python Async 编程快速入门 | 超简明异步协程指南
  • C++常用算法解析:sort、find、for_each、copy
  • 阶段二开始-第一章—8天Python从入门到精通【itheima】-116节(封装)
  • cuda编程笔记(5)--原子操作
  • UI前端与数字孪生结合案例分享:智慧零售的可视化解决方案
  • 北京燃气集团管道腐蚀智能预测实践:LSTM算法驱动能源设施安全升级
  • VSCode中创建和生成动态库项目
  • 智能呼叫系统五大核心模式解析
  • 使用mitmdump实现高效实时抓包处理:从原理到实践
  • 技术博客:如何用针孔相机模型理解图像
  • 基于Redis分布式的限流
  • 一款专业的顽固软件卸载工具
  • ubuntu下利用Qt添加相机设备并运行arm程序
  • GO 语言学习 之 变量和常量
  • 神经形态计算与人工智能的融合:从生物启发到智能跃迁的IT新纪元
  • 本地部署Dify+Ragflow及使用(一)
  • PHP语法基础篇(六):数组
  • 通达信 稳定盈利多维度趋势分析系统