运行 python脚本每月一次,给脚本传递参数
run python script once a month, pass parameters to script
大家好,在此先感谢您的帮助。
我有一个 python 脚本,它是通过命令行启动的,字符串如下:
python example.py [start-date] [end-date] [fixed-param]
我想每月(在 ubuntu)自动设置一次 运行,但每个月的 [start-date] 和 [end-date] 必须不同。
该脚本会下载上个月的一些数据,因此如果它 运行s,比如说,5 月 1 日,它必须通过 [start-date]='01-04-2017'
和 [end-date]='30-04-2017'
.
在我的意图中,脚本会在没有我干预的情况下每月 运行,所以我需要将日期设置为变量或其他东西。
最简单的解决方案是什么?
听起来您应该使用 Crontab 来自动执行 python 脚本 运行。有关如何开始使用 Crontab 的信息,请查看此处:
查看之前的两个堆栈溢出问题,了解有关如何在 crontab 中传递参数和设置日期变量的信息:
我建议您在 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')
我在 crontab 和 Python 方面的经验比我想要的要多,这里是我学到的一些教训:
- 在脚本中捕获所有输出 (stdout/stderr)
- 在 crontab 行中捕获脚本中 'leaks' 的任何输出(根据您的需要小心追加或覆盖)
- 使用空环境测试您的脚本,例如
env -i
- cron 在特殊环境下运行。如果你不使用裸环境进行测试,你会经常发现你对非裸环境有未完成的依赖
- 将你的论据构建到你的脚本中
- 如果您不熟悉 #2 and/or #4,请用 sh/bash 脚本
包装您的 python 脚本
- 当心“%”,小心逃脱 - 它很特别!
示例如下:
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
进行测试
大家好,在此先感谢您的帮助。
我有一个 python 脚本,它是通过命令行启动的,字符串如下:
python example.py [start-date] [end-date] [fixed-param]
我想每月(在 ubuntu)自动设置一次 运行,但每个月的 [start-date] 和 [end-date] 必须不同。
该脚本会下载上个月的一些数据,因此如果它 运行s,比如说,5 月 1 日,它必须通过 [start-date]='01-04-2017'
和 [end-date]='30-04-2017'
.
在我的意图中,脚本会在没有我干预的情况下每月 运行,所以我需要将日期设置为变量或其他东西。
最简单的解决方案是什么?
听起来您应该使用 Crontab 来自动执行 python 脚本 运行。有关如何开始使用 Crontab 的信息,请查看此处:
查看之前的两个堆栈溢出问题,了解有关如何在 crontab 中传递参数和设置日期变量的信息:
我建议您在 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')
我在 crontab 和 Python 方面的经验比我想要的要多,这里是我学到的一些教训:
- 在脚本中捕获所有输出 (stdout/stderr)
- 在 crontab 行中捕获脚本中 'leaks' 的任何输出(根据您的需要小心追加或覆盖)
- 使用空环境测试您的脚本,例如
env -i
- cron 在特殊环境下运行。如果你不使用裸环境进行测试,你会经常发现你对非裸环境有未完成的依赖 - 将你的论据构建到你的脚本中
- 如果您不熟悉 #2 and/or #4,请用 sh/bash 脚本 包装您的 python 脚本
- 当心“%”,小心逃脱 - 它很特别!
示例如下:
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