繁体   English   中英

Crontab Python脚本执行(找不到设置配置文件)

[英]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放入crontab中的相应目录( 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM