Python脚本通过Cron执行时解析配置文件报KeyError问题排查
问题原因及解决办法
核心问题:Cron执行时的工作目录与脚本所在目录不一致
你手动运行脚本时,当前工作目录就是脚本所在的/home/user/,所以config.read('config.ini')能正常找到配置文件;但Cron执行任务时,默认工作目录并不是脚本所在目录,导致用相对路径找不到config.ini,此时config对象是空的,自然会报KeyError找不到section1。
解决方法(任选其一)
方法1:在Python脚本中使用配置文件的绝对路径
修改读取配置文件的代码,把相对路径换成绝对路径(确保路径和你的实际配置文件位置一致):config.read('/home/user/config.ini')方法2:在Cron任务中先切换到脚本目录再执行
修改Cron任务内容,先切换到脚本所在目录,再运行脚本:25 13 * * * cd /home/user && python3 script.py section1方法3:让脚本自动获取自身所在目录(推荐,灵活性高)
通过Python的os模块获取脚本的绝对路径,再拼接配置文件路径,这样不管在哪里运行脚本都能找到配置文件:import sys import configparser import os section = sys.argv[1] # 获取脚本所在目录 script_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接配置文件路径 config_path = os.path.join(script_dir, 'config.ini') config = configparser.ConfigParser() config.read(config_path) foobar = config[section]['key1']
关于你怀疑的引号问题
完全不用担心,Cron里传递section1作为参数的方式是正常的,sys.argv[1]确实能正确拿到'section1'字符串,和手动运行时的参数解析没有区别。
内容的提问来源于stack exchange,提问作者Astrodude11
相关产品推荐
相关产品推荐

