[英]Crontab Python Script Execution (Can't find settings config file)
我的Crontab -l
# m h dom mon dow command
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
00 8,20 * * * python /home/tomi/amaer/controller.py >>/tmp/out.txt 2>&1
我的controller.py具有配置文件settings.cfg,它还在其所在的文件夹中使用其他脚本(我仅对controller.py进行了更改)
错误
1;31mIOError^[[0m: [Errno 2] No such file or directory: 'settings.cfg'
我不知道该如何解决? 请帮我?
编辑:读取配置文件的部分
def main():
config=ConfigParser.ConfigParser()
config.readfp(open("settings.cfg"),"r")
您的代码正在其当前工作目录中查找settings.cfg
。
当cron执行作业时,此工作目录将不同,因此会出现错误
您有两个“简单”的解决方案:
/home/tomi/amaer/config.cfg
)中使用配置文件的绝对路径 cd /home/tomi/amaer/ && python /home/tomi/amaer/controller.py
) 不过,“正确”的解决方案是向脚本传递一个参数(或环境变量),该参数告诉脚本在哪里寻找配置文件。
假设您的配置文件将始终位于脚本旁边,这并不是完全正确的做法。
您可能想看看这个问题: https ://unix.stackexchange.com/questions/38951/what-is-the-working-directory-when-cron-executes-a-job
正如我最初在评论中所写的那样,这是因为您正在使用当前工作目录的相对路径。 但是,当通过cron可执行文件而不是直接通过shebang运行python解释器时,这一切都不相同。
您当前的代码将在cron可执行文件所在的当前工作目录(而不是您的脚本)中查找“ settings.cfg”。 因此,您需要借助“ os”内置标准模块将代码逻辑更改为使用绝对路径。
尝试以下行:
import os
...
def main():
config = ConfigParser.ConfigParser()
scriptDirectory = os.path.dirname(os.path.realpath(__file__))
settingsFilePath = os.path.join(scriptDirectory, "settings.cfg")
config.readfp(open(settingsFilePath,"r"))
这将为您提供脚本的路径,然后为操作系统(在这种情况下为Linux)附加“ settings.cfg”和适当的目录分隔符。
如果配置文件的位置在将来的任何时间发生更改,则可以使用argparse模块来处理命令行参数以正确处理配置位置,甚至不使用它,也可以仅使用脚本名称(例如sys.argv[1]
之后的第一个参数sys.argv[1]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.