This question already has an answer here:
这个问题在这里已有答案:
- How do I get a Cron like scheduler in Python? 20 answers
- 如何在Python中获得类似Cron的调度程序? 20个答案
I have a long running python script that I want to do someting at 01:00 every morning.
我有一个长期运行的python脚本,我想在每天早上01:00做一些事情。
I have been looking at the sched module and at the Timer object but I can't see how to use these to achieve this.
我一直在看sched模块和Timer对象,但我看不到如何使用它们来实现这一点。
4 个解决方案
#1
33
You can do that like this:
你可以这样做:
from datetime import datetime
from threading import Timer
x=datetime.today()
y=x.replace(day=x.day+1, hour=1, minute=0, second=0, microsecond=0)
delta_t=y-x
secs=delta_t.seconds+1
def hello_world():
print "hello world"
#...
t = Timer(secs, hello_world)
t.start()
This will execute a function (eg. hello_world) in the next day at 1a.m.
这将在第二天的下午1点执行一个函数(例如hello_world)。
#2
67
I spent quite a bit of time also looking to launch a simple Python program at 01:00. For some reason, I couldn't get cron to launch it and APScheduler seemed rather complex for something that should be simple. Schedule (https://pypi.python.org/pypi/schedule) seemed about right.
我花了很多时间也想在01:00启动一个简单的Python程序。出于某种原因,我无法让cron启动它,而APScheduler似乎相当复杂,应该是简单的东西。时间表(https://pypi.python.org/pypi/schedule)似乎是正确的。
You will have to install their Python library:
您必须安装他们的Python库:
pip install schedule
This is modified from their sample program:
这是从他们的示例程序修改的:
import schedule
import time
def job(t):
print "I'm working...", t
return
schedule.every().day.at("01:00").do(job,'It is 01:00')
while True:
schedule.run_pending()
time.sleep(60) # wait one minute
You will need to put your own function in place of job and run it with nohup, e.g.:
您需要将自己的功能放在工作位置并使用nohup运行,例如:
nohup python2.7 MyScheduledProgram.py &
Don't forget to start it again if you reboot.
如果重新启动,请不要忘记再次启动它。
#3
11
APScheduler might be what you are after.
APScheduler可能就是你所追求的。
from datetime import date
from apscheduler.scheduler import Scheduler
# Start the scheduler
sched = Scheduler()
sched.start()
# Define the function that is to be executed
def my_job(text):
print text
# The job will be executed on November 6th, 2009
exec_date = date(2009, 11, 6)
# Store the job in a variable in case we want to cancel it
job = sched.add_date_job(my_job, exec_date, ['text'])
# The job will be executed on November 6th, 2009 at 16:30:05
job = sched.add_date_job(my_job, datetime(2009, 11, 6, 16, 30, 5), ['text'])
https://apscheduler.readthedocs.io/en/latest/
https://apscheduler.readthedocs.io/en/latest/
You can just get it to schedule another run by building that into the function you are scheduling.
您可以通过将其构建到您正在安排的功能中来安排另一次运行。
#4
5
I needed something similar for a task. This is the code I wrote: It calculates the next day and changes the time to whatever is required and finds seconds between currentTime and next scheduled time.
我需要类似的任务。这是我写的代码:它计算第二天并将时间更改为所需的任何时间,并查找currentTime和下一个计划时间之间的秒数。
import datetime as dt
def my_job():
print "hello world"
nextDay = dt.datetime.now() + dt.timedelta(days=1)
dateString = nextDay.strftime('%d-%m-%Y') + " 01-00-00"
newDate = nextDay.strptime(dateString,'%d-%m-%Y %H-%M-%S')
delay = (newDate - dt.datetime.now()).total_seconds()
Timer(delay,my_job,()).start()
#1
33
You can do that like this:
你可以这样做:
from datetime import datetime
from threading import Timer
x=datetime.today()
y=x.replace(day=x.day+1, hour=1, minute=0, second=0, microsecond=0)
delta_t=y-x
secs=delta_t.seconds+1
def hello_world():
print "hello world"
#...
t = Timer(secs, hello_world)
t.start()
This will execute a function (eg. hello_world) in the next day at 1a.m.
这将在第二天的下午1点执行一个函数(例如hello_world)。
#2
67
I spent quite a bit of time also looking to launch a simple Python program at 01:00. For some reason, I couldn't get cron to launch it and APScheduler seemed rather complex for something that should be simple. Schedule (https://pypi.python.org/pypi/schedule) seemed about right.
我花了很多时间也想在01:00启动一个简单的Python程序。出于某种原因,我无法让cron启动它,而APScheduler似乎相当复杂,应该是简单的东西。时间表(https://pypi.python.org/pypi/schedule)似乎是正确的。
You will have to install their Python library:
您必须安装他们的Python库:
pip install schedule
This is modified from their sample program:
这是从他们的示例程序修改的:
import schedule
import time
def job(t):
print "I'm working...", t
return
schedule.every().day.at("01:00").do(job,'It is 01:00')
while True:
schedule.run_pending()
time.sleep(60) # wait one minute
You will need to put your own function in place of job and run it with nohup, e.g.:
您需要将自己的功能放在工作位置并使用nohup运行,例如:
nohup python2.7 MyScheduledProgram.py &
Don't forget to start it again if you reboot.
如果重新启动,请不要忘记再次启动它。
#3
11
APScheduler might be what you are after.
APScheduler可能就是你所追求的。
from datetime import date
from apscheduler.scheduler import Scheduler
# Start the scheduler
sched = Scheduler()
sched.start()
# Define the function that is to be executed
def my_job(text):
print text
# The job will be executed on November 6th, 2009
exec_date = date(2009, 11, 6)
# Store the job in a variable in case we want to cancel it
job = sched.add_date_job(my_job, exec_date, ['text'])
# The job will be executed on November 6th, 2009 at 16:30:05
job = sched.add_date_job(my_job, datetime(2009, 11, 6, 16, 30, 5), ['text'])
https://apscheduler.readthedocs.io/en/latest/
https://apscheduler.readthedocs.io/en/latest/
You can just get it to schedule another run by building that into the function you are scheduling.
您可以通过将其构建到您正在安排的功能中来安排另一次运行。
#4
5
I needed something similar for a task. This is the code I wrote: It calculates the next day and changes the time to whatever is required and finds seconds between currentTime and next scheduled time.
我需要类似的任务。这是我写的代码:它计算第二天并将时间更改为所需的任何时间,并查找currentTime和下一个计划时间之间的秒数。
import datetime as dt
def my_job():
print "hello world"
nextDay = dt.datetime.now() + dt.timedelta(days=1)
dateString = nextDay.strftime('%d-%m-%Y') + " 01-00-00"
newDate = nextDay.strptime(dateString,'%d-%m-%Y %H-%M-%S')
delay = (newDate - dt.datetime.now()).total_seconds()
Timer(delay,my_job,()).start()