1

My 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

My controller.py has config file settings.cfg also it uses other script in the folder it's located (I chmoded only controller.py)

The error

1;31mIOError^[[0m: [Errno 2] No such file or directory: 'settings.cfg'

I have no idea how to fix this? Please help me?

Edit: The part that read the config file

def main():
    config=ConfigParser.ConfigParser()
    config.readfp(open("settings.cfg"),"r")
4

2 回答 2

2

您的代码正在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

于 2013-09-14T08:53:20.120 回答
2

正如我最初在评论中所写,这是因为您使用的是当前工作目录的相对路径。但是,当通过 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”中附加适用于您的操作系统(在这种特殊情况下为 Linux)的适当目录分隔符。

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

于 2013-09-14T08:54:21.410 回答