• 【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【捂脸】。。。。。总之这条谨记吧。。以上。

  • 相关阅读:
    搭建redis sentinel 和 cluster
    ASP.NET WebForm Ajax请求Handler的经验
    ASP.NET WebForm Identity使用
    Github Pages 无法调用 node_modules 文件夹的解决方案
    聊聊手机之--小米6
    boostrap-非常好用但是容易让人忽略的地方【7】:list-unstyled list-inline
    boostrap-非常好用但是容易让人忽略的地方【6】:role属性
    monaco-editor使用
    关于oppo和vivo这两年强势崛起的反思
    Build 2017(简体中文视频)
  • 原文地址:https://www.cnblogs.com/franknihao/p/7300752.html
Copyright © 2020-2023  润新知