Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
每月运行一次python脚本,将参数传递给脚本_Python_Date_Cron_Crontab_Cron Task - Fatal编程技术网

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

每月运行一次python脚本,将参数传递给脚本,python,date,cron,crontab,cron-task,Python,Date,Cron,Crontab,Cron Task,大家好,提前感谢大家的帮助 我有一个python脚本,它是通过命令行启动的,带有如下字符串: python example.py [start-date] [end-date] [fixed-param] 我想让它每月自动运行一次(在ubuntu上),但每个月的[开始日期]和[结束日期]必须不同。 脚本下载了一些上个月的数据,因此如果它运行,比如说5月1日,它必须通过[开始日期]='01-04-2017'adn[结束日期]='30-04-2017' 在我的意图中,脚本将在没有我干预的情况下每月

大家好,提前感谢大家的帮助

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

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

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


最简单的解决方案是什么?

听起来您应该使用Crontab来自动运行python脚本。有关如何开始使用Crontab的信息,请查看以下内容:

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


听起来您应该使用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))
您可以使用它来格式化:

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

我建议您使用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))
您可以使用它来格式化:

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

我在crontab和Python方面的经验比我想象的要多,下面是我学到的一些经验:

  • 捕获脚本中的所有输出(stdout/stderr)
  • 在crontab行中捕获脚本中“泄漏”的任何输出(根据需要,小心追加或覆盖)
  • 使用空环境测试脚本,例如使用
    env-i
    -cron在特殊环境下运行。如果您不使用裸环境进行测试,您通常会发现您对非裸环境有未实现的依赖关系
  • 将参数构建到脚本中
  • 如果您不熟悉#2和/或#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示例,其中包括丑陋的date命令示例,尽管我强烈建议使用Tom建议的.py方法和datetime:

    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

    来测试这一点,我对crontab和python的经验比我想要的要多,下面是我学到的一些经验:

  • 捕获脚本中的所有输出(stdout/stderr)
  • 在crontab行中捕获脚本中“泄漏”的任何输出(根据需要,小心追加或覆盖)
  • 使用空环境测试脚本,例如使用
    env-i
    -cron在特殊环境下运行。如果您不使用裸环境进行测试,您通常会发现您对非裸环境有未实现的依赖关系
  • 将参数构建到脚本中
  • 如果您不熟悉#2和/或#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示例,其中包括丑陋的date命令示例,尽管我强烈建议使用Tom建议的.py方法和datetime:

    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

    来测试这一点,我认为您可以使用
    datetime
    来“发现”上个月。你只需要得到当前日期,减去一个月。这行得通吗?我想你可以用
    datetime
    来“发现”上个月。你只需要得到当前日期,减去一个月。这行得通吗?谢谢,我必须研究你告诉我的一些主题,但这非常有帮助谢谢,我必须研究你告诉我的一些主题,但这非常有帮助