【问题标题】:Make python script run everyday within certain hours让python脚本在特定小时内每天运行
【发布时间】:2015-08-18 06:57:04
【问题描述】:

我正在尝试制作一个 python 脚本(无限循环),使其每天从上午 9 点工作到 23 点左右,并且一遍又一遍地工作。我做了一些研究,最后想出了这段代码:

while True:
    if dt.now().hour in range(9, 23):  
        if __name__ == "__main__":

            """ Not important """

            while True:
                try:
                    """ bet_automation contains all the necessary code """

                    bet_automation()

                except Exception as ex:

                    """ Catch all the error of bet_automation() and restart program """

                    print_error(ex)
                    time.sleep(5)
                    if not isinstance(ex, LoginTimeoutException):
                        try:
                            driver = get_driver()
                            filename = str(time.time())
                            driver.get_screenshot_as_file("errors/{}.png".format(filename))
                            with io.open("errors/{}.html".format(filename)) as f:
                                f.write(unicode(driver.page_source))
                        except:
                            pass
                    try:
                        quit_driver()
                    except:
                        pass

    else:
        sys.exit(0)

这样,脚本可以在 20:00 开始并正常运行。即使我早一点运行它,它也只是在 20.00 开始工作,这很好,但它并没有在 21 结束,这令人困惑。

我很清楚这可能是一个超级简单和愚蠢的问题,但正如我所说,我是终极初学者。我有这个脚本由“专业”程序员编写,我正在尝试编辑和改进它,我想自己做以了解整个过程。

高度赞赏每一个见解,

非常感谢,

:)

【问题讨论】:

  • 无限循环嵌套在另一个无限循环中?听起来很危险
  • 您的代码显示为 9:00 -> 23:00,但您的描述中提到了 20:00 和 21:00。它是哪一个?还是我看错了?
  • 这可能是一个有趣的问题...但是您确实意识到按计划运行脚本通常由操作系统处理,对吗?
  • 看 Cron 或 Celery

标签: python time


【解决方案1】:

您的代码包含两个循环。首先,外循环。这个基本无关;如果您在 9:00 和 23:00 之间的某个时间启动程序,dt.now().hour in range(9, 23) 将评估为True,因此代码将进入内部(无限)循环。如果条件评估为False,程序将退出。所以,外层循环体只会被执行一次。

然后,内部循环。这个是无限的,只要一输入密码就永远不会跳出来。如果在某个迭代中bet_automation() 没有抛出异常,它将在下一次迭代中再次执行。如果在某个迭代中bet_automation()确实抛出错误,它会被简单地捕获和处理,然后循环将继续。

如果您希望代码在某个时间点停止,则需要在 inner 循环内构建对当前时间的检查,如下所示:

while True:
    try:
         bet_automation()
         if dt.now().hour not in range(9, 23):
             break
(...)

【讨论】:

    猜你喜欢
    • 2021-05-04
    • 2020-11-01
    • 2021-04-05
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多