【发布时间】:2013-02-11 20:09:57
【问题描述】:
【问题讨论】:
-
也可以考虑通过cron运行一个单独的脚本。
-
是的,应该说,无权访问
cron。
标签: python python-2.7 scheduler
【问题讨论】:
cron。
标签: python python-2.7 scheduler
我还花了很多时间寻找在 01:00 启动一个简单的 Python 程序。出于某种原因,我无法让 cron 启动它,而且 APScheduler 对于本应简单的事情来说似乎相当复杂。时间表 (https://pypi.python.org/pypi/schedule) 似乎是正确的。
你必须安装他们的 Python 库:
pip install schedule
这是从他们的示例程序修改而来的:
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
您需要将自己的函数替换为作业并使用 nohup 运行它,例如:
nohup python2.7 MyScheduledProgram.py &
重启后别忘了重新启动。
【讨论】:
While block 阻止其他代码行运行,有什么办法解决这个问题吗?
你可以这样做:
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()
这将在第二天凌晨 1 点执行一个函数(例如 hello_world)。
编辑:
正如@PaulMag 所建议的,更一般地,为了检测是否由于到达月底而必须重新设置月份中的某天,在此上下文中 y 的定义应如下:
y = x.replace(day=x.day, hour=1, minute=0, second=0, microsecond=0) + timedelta(days=1)
使用此修复程序,还需要将 timedelta 添加到导入中。其他代码行保持不变。因此,使用 total_seconds() 函数的完整解决方案是:
from datetime import datetime, timedelta
from threading import Timer
x=datetime.today()
y = x.replace(day=x.day, hour=1, minute=0, second=0, microsecond=0) + timedelta(days=1)
delta_t=y-x
secs=delta_t.total_seconds()
def hello_world():
print "hello world"
#...
t = Timer(secs, hello_world)
t.start()
【讨论】:
Timer。
secs = delta_t.seconds+1的行上加1秒?
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/
您可以通过将其构建到您正在安排的功能中来安排另一次运行。
【讨论】:
我需要类似的东西来完成一项任务。这是我写的代码: 它计算第二天并将时间更改为所需的时间,并找到 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()
【讨论】: