大家好,并提前感谢您的帮助。
我有一个python脚本,它是通过命令行启动的,其字符串如下:
python example.py [start-date] [end-date] [fixed-param]
我想让它每月自动运行一次(在ubuntu上),但每个月[开始日期]和[结束日期]必须不同。
该脚本会下载上个月的一些数据,因此如果它运行,比如5月1日,则必须通过[start-date]='01-04-2017'
adn [end-date]='30-04-2017'
。
在我的意图中,脚本会在没有我介入的情况下每月运行,因此我需要将日期设置为变量或其他内容。
最简单的解决办法是什么?
答案 0 :(得分:1)
听起来你应该使用Crontab自动运行python脚本。有关如何开始使用Crontab的信息,请查看此处:
查看这两个先前的堆栈溢出问题,了解有关如何传递参数和在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的经验比我想要的多,这里有一些我学到的经验教训:
env -i
- cron在特殊环境下运行。如果您不在裸环境中进行测试,您通常会发现您的非裸环境中存在未实现的依赖关系以下是示例:
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.py
或env -i /path/to/my/script.bash