我如何在python中安排程序

时间:2018-09-28 13:15:39

标签: python windows cron schedule

我想要一个使我的主程序每周运行两次的程序...我尝试使用crontab,但是由于我正在Windows上进行编程(结果很困难),所以我无法使其正常运行,并且我想要该程序在Windows上运行

我的主程序没有做任何疯狂的事情,只是检查一个excel文件并在tkinter窗口中为您提供一些信息

我也了解了Windows中的任务计划程序,但是我想在程序中自由编辑或删除计划的事件... any help

4 个答案:

答案 0 :(得分:0)

有一个简单的方法可以做到这一点,亲爱的朋友! 首先,您应该在计算机上使用Linux OS安装虚拟机(使用virtualbox和vmware)。 您可以只使用Linux crontab

cronb -e

并使用您喜欢的编辑器,并编写此行

0 8 * * 3,7 python /path/to/dir/test.py

,您的代码将在周三和周日的08:00执行。

答案 1 :(得分:0)

您可以使用Task Scheduler API以编程方式创建计划的任务。例如:https://ziade.org/2007/11/01/scheduling-tasks-in-windows-with-pywin32/

如果您不想让pywin32成为该项目的依赖项,则可以使用子进程库通过调用schtask.exe来进行更简单的调度。

答案 2 :(得分:0)

使用Croniter解决。它适用于Linux。在Windows上尝试。

from datetime import datetime, timedelta   #for Scheduler
import time
from croniter import croniter

# Class for Scheduling
class schedule_fun():
    def starter(self):
        nextRunTime = self.getNextCronRunTime(schedule)
        while True:
             roundedDownTime = self.roundDownTime()
             if (roundedDownTime == nextRunTime):
                 global timestamp
                 timestamp = datetime.now().strftime("%B %d %Y, %H:%M:%S")
                 #For setting variables with values
                 print ("Hi, I am Steven")
                 nextRunTime = self.getNextCronRunTime(schedule)
             elif (roundedDownTime > nextRunTime):
                 print("error")

                 # We missed an execution. Error. Re initialize.
                 nextRunTime = self.getNextCronRunTime(schedule)
             self.sleepTillTopOfNextMinute()
    # Round time down to the top of the previous minute
    def roundDownTime(self,dt=None, dateDelta=timedelta(minutes=1)):
        roundTo = dateDelta.total_seconds()
        if dt == None : dt = datetime.now()
        seconds = (dt - dt.min).seconds
        rounding = (seconds+roundTo/2) // roundTo * roundTo
        return dt + timedelta(0,rounding-seconds,-dt.microsecond)
    # Get next run time from now, based on schedule specified by cron string
    def getNextCronRunTime(self,schedule):
        return croniter(schedule, datetime.now()).get_next(datetime)
    # Sleep till the top of the next minute
    def sleepTillTopOfNextMinute(self):
        t = datetime.utcnow()
        sleeptime = 60 - (t.second + t.microsecond/1000000.0)
        time.sleep(sleeptime)

# Program starts here!!!!
if __name__ == '__main__':
    schedule =  '*/1 * * * *'
    scl = schedule_fun()
    scl.starter()

答案 3 :(得分:-1)

Apache airflow将完成工作

  

每个DAG可能有也可能没有时间表,该时间表告知如何创建DAG运行。 schedule_interval被定义为DAG参数,并且最好接收cron表达式作为str或datetime.timedelta对象。另外,您也可以使用这些cron“预设”之一