我的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")
答案 0 :(得分:2)
您的代码正在其当前工作目录中查找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
答案 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]
。