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

时间:2013-09-14 08:05:27

标签: python linux cron crontab

我的Crontab -l <​​/ p>

# 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")

2 个答案:

答案 0 :(得分:2)

您的代码正在其当前工作目录中查找settings.cfg

当cron执行作业时,此工作目录将不同,因此错误

您有两个“简单”的解决方案:

  • 在脚本中使用配置文件的绝对路径(/home/tomi/amaer/config.cfg
  • 首先在您的crontab(cd /home/tomi/amaer/ && python /home/tomi/amaer/controller.py
  • 中找到相应目录的CD

“正确”的解决方案是向您的脚本传递一个参数(或环境变量),告诉它在哪里查找配置文件。

假设您的配置文件始终位于脚本旁边并不是一个好的做法。


您可能想要了解这个问题:https://unix.stackexchange.com/questions/38951/what-is-the-working-directory-when-cron-executes-a-job

答案 1 :(得分:1)

正如我最初在评论中写的那样,这是因为您正在使用当前工作目录的相对路径。但是,当通过cron可执行文件而不是直接通过shebang的python解释器运行所有这些时,这不会是相同的。

您当前的代码将在当前工作目录中查找“settings.cfg”,这是cron可执行文件所在的位置,而不是您的脚本。因此,您需要在“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"))

这将获取您的脚本路径,然后将“settings.cfg”附加到适用于您的操作系统的适当dir分隔符,在这种情况下是Linux。

如果配置文件的位置在将来的任何时间发生变化,您可以使用argparse模块处理命令行参数以正确处理配置位置,甚至不使用它只是在脚本名称之后使用第一个参数比如sys.argv[1]