每月运行一次python脚本,将参数传递给脚本

时间:2017-04-18 17:19:55

标签: python date cron crontab cron-task

大家好,并提前感谢您的帮助。

我有一个python脚本,它是通过命令行启动的,其字符串如下:

python example.py [start-date] [end-date] [fixed-param]

我想让它每月自动运行一次(在ubuntu上),但每个月[开始日期]和[结束日期]必须不同。 该脚本会下载上个月的一些数据,因此如果它运行,比如5月1日,则必须通过[start-date]='01-04-2017' adn [end-date]='30-04-2017'

在我的意图中,脚本会在没有我介入的情况下每月运行,因此我需要将日期设置为变量或其他内容。

最简单的解决办法是什么?

3 个答案:

答案 0 :(得分:1)

听起来你应该使用Crontab自动运行python脚本。有关如何开始使用Crontab的信息,请查看此处:

Crontab how to

查看这两个先前的堆栈溢出问题,了解有关如何传递参数和在crontab中设置日期变量的信息:

passing parameters to a python script with crontab

date variables in crontab

答案 1 :(得分:1)

我建议你在Python脚本中获取日期。以下是如何计算上个月的示例。

import datetime

def last_month(today=None):
    if today is None:
        today = datetime.date.today()
    lastmonthend = today.replace(day=1) - datetime.timedelta(days=1)
    lastmonthstart = lastmonthend.replace(day=1)
    return lastmonthstart, lastmonthend

print(last_month())

2017年4月18日的运行给了我:

(datetime.date(2017, 3, 1), datetime.date(2017, 3, 31))

您可以使用strftime格式化为:

('01-03-2017', '31-03-2017')

答案 2 :(得分:0)

我对crontab和Python的经验比我想要的多,这里有一些我学到的经验教训:

  1. 捕获脚本中的所有输出(stdout / stderr)
  2. 捕获在crontab行中“泄漏”脚本的任何输出(小心附加或覆盖,具体取决于您的需要)
  3. 使用空的环境测试脚本,例如使用env -i - cron在特殊环境下运行。如果您不在裸环境中进行测试,您通常会发现您的非裸环境中存在未实现的依赖关系
  4. 将您的参数构建到脚本中
  5. 如果您不熟悉#2和/或#4,请使用sh / bash脚本包装您的python脚本
  6. 小心'%',小心逃脱 - 这很特别!
  7. 以下是示例:

    0   0   1   *   *    /usr/bin/python /path/to/my/script.py 2>&1 >> /tmp/leaked_cron_script_py.out
    0   0   1   *   *    /path/to/my/script.bash 2>&1 >> /tmp/leaked_cron_script_bash.out
    

    这是一个包含丑陋日期命令示例的script.bash示例,但我强烈建议使用Tom建议的.py方法和日期时间:

    first_day_of_last_month=$(date -d "last month" +01-%m-%Y)
    last_day_of_last_month=$(date --date=@$(( $(date -d "$(date +%Y-%m-01)"  +%s) - 86400)) +%d-%m-%Y)
    /path/to/my/script.py $first_day_of_last_month $last_day_of_last_month $FIXED_PARAMETER 2>&1 >> /tmp/leaked_cron_script_py.out
    

    我会使用env -i /usr/bin/python /path/to/my/script.pyenv -i /path/to/my/script.bash

    对此进行测试