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

【Python】 配置文件相对路径软件自动执行的工作目录

  今天对监控脚本做了一些变更,然后突然发现监控全部都失效了。。排查了半天问题仍然不知所踪。最终发现居然是一个踩过好几次的老坑。。

  就是脚本内写的配置文件为了调试方便写成了相对路径,但是在上线时没有意识到软件自动执行(比如Zabbix的externalcheck,虽然所有脚本都可以放在统一的目录下,给人一种这个目录就是zabbix执行外部检查时的工作目录的错觉,但是实际上并不是。。)时自动执行的工作目录并不一定是当前目录。介于这个坑已经踩过多次,下面给出实例和解决办法:

import ConfigParser

cf = ConfigParser()
CONF_FILE = 'server.conf'    #在本地写脚本时为了调试方便,在脚本同目录下创建了一个配置文件进行配置
cf.read(CONF_FILE)
#下面对CONF_FILE做一些处理

#同样的脚本,让zabbix自己去跑就报错了???然后登上目录自己手动执行,又没问题???就是路径的锅!
#把路径改成绝对路径就OK了
CONF_FILE = '/usr/lib/zabbix/externalscripts/server.conf'

  仔细想一下,这个锅其实也是ConfigParser这个模块本身的一个小“缺陷”吧。因为ConfigParser.ConfigParser().read(path)的时候,即便path不存在也不会报错。如果报错了的话,我们就可以很快定位问题了。所以切记切记,用ConfigParser之前一定要os.path.isfile(path)检查一下!

  

  如果想要保留配置文件和脚本在移植上的灵活性,可以这样搞:

work_dir = os.path.dirname(os.path.abspath(__file__))
CONF_FILE = os.path.join(work_dir,'server.conf')
#这样就既可以保证CONF_FILE的绝对路径,又不会写死了。

  类似的这种操作写过很多次,就不再重复了。

 

■  不要把配置文件验证等铺垫性工作放到if __name__ == "__main__"外面

  今天又遇到这个坑了【抓狂】。。。。。。总结一下经验,发现配置文件验证、脚本参数接受(sys.argv)这些工作 不要放在if __name__ == '__main__'的外面。在调试的时候可能报错可以直接受到信息,但是在上线之后,其他程序调用这个脚本时可能并不会把报错信息体现出来,然后我想加个日志功能吧,虽然考虑了所有裸在外面的语句的错误捕获,又忽略了logging.basicConfig这个语句本身又是裸的,更啃爹的是这个语句也涉及到了配置文件,又写了一个相对路径,所以加了日志功能但也加了个bug【捂脸】。。。。。总之这条谨记吧。。以上。

转载于:https://www.cnblogs.com/franknihao/p/7300752.html

相关文章:

  • [SDUT](3361) 数据结构实验之图论四:迷宫探索 ---DFS(图)
  • proxy汇总-1
  • 使用for循环输出九九乘法表
  • ffmpeg学习(二) 通过rtsp获取H264裸流并保存到mp4文件
  • 安装node.js和npm
  • 推荐几款谷歌浏览器的使用插件
  • webservcie学习之webservice是什么
  • Win10《芒果TV》更新v3.6.0秋收版:新增追剧磁贴、记忆续播、跳转列表
  • Centos7安装TensorFlow
  • 没有绝对的cc.ResolutionPolicy.FIXED_WIDTH或cc.ResolutionPolicy.FIXED_HEIGHT
  • Spring 定时任务之 @Scheduled cron表达式
  • Java内存知识整理
  • 嵌入式GPIO接口及操作(一)
  • Redis源代码剖析--对象object
  • JavaScript 基本语法
  • ES6指北【2】—— 箭头函数
  • Android组件 - 收藏集 - 掘金
  • Computed property XXX was assigned to but it has no setter
  • IOS评论框不贴底(ios12新bug)
  • Java Agent 学习笔记
  • JavaScript标准库系列——Math对象和Date对象(二)
  • java多线程
  • Java方法详解
  • Java基本数据类型之Number
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • ubuntu 下nginx安装 并支持https协议
  • 阿里云前端周刊 - 第 26 期
  • 安装python包到指定虚拟环境
  • 程序员最讨厌的9句话,你可有补充?
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 翻译--Thinking in React
  • 关于使用markdown的方法(引自CSDN教程)
  • 汉诺塔算法
  • 缓存与缓冲
  • 前端性能优化——回流与重绘
  • 阿里云ACE认证之理解CDN技术
  • 关于Android全面屏虚拟导航栏的适配总结
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​ubuntu下安装kvm虚拟机
  • ​什么是bug?bug的源头在哪里?
  • !!Dom4j 学习笔记
  • #pragma 指令
  • #WEB前端(HTML属性)
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (07)Hive——窗口函数详解
  • (2)STM32单片机上位机
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (二)fiber的基本认识
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (四)Controller接口控制器详解(三)
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一)u-boot-nand.bin的下载
  • (一)认识微服务