环境
python:2.7
APScheduler:3.9.1.post1
问题
执行定时任务脚本时报错如下
Traceback (most recent call last):
File "scheduled_tasks.py", line 163, in <module>
scheduler.start()
File "/home/xiaoju/python27/lib/python2.7/site-packages/apscheduler/schedulers/blocking.py", line 20, in start
super(BlockingScheduler, self).start(*args, **kwargs)
File "/home/xiaoju/python27/lib/python2.7/site-packages/apscheduler/schedulers/base.py", line 167, in start
self._real_add_job(job, jobstore_alias, replace_existing)
File "/home/xiaoju/python27/lib/python2.7/site-packages/apscheduler/schedulers/base.py", line 863, in _real_add_job
replacements['next_run_time'] = job.trigger.get_next_fire_time(None, now)
File "/home/xiaoju/python27/lib/python2.7/site-packages/apscheduler/triggers/interval.py", line 68, in get_next_fire_time
return normalize(next_fire_time)
File "/home/xiaoju/python27/lib/python2.7/site-packages/apscheduler/util.py", line 431, in normalize
return datetime.fromtimestamp(dt.timestamp(), dt.tzinfo)
AttributeError: 'datetime.datetime' object has no attribute 'timestamp'
这种情况其实就是python2.7的datetime.datetime没有timestamp这个方法。也就是说这个版本的apscheduler并不适配Python2.7。
其实最适用于python2的版本是2.1.2
解决方式
- 更换apscheduler版本为2.1.2
- 将python2升级到python3
- 如果以上方法觉得有些麻烦或者不方便的话,那就直接改底层源码,简单暴力。把用到的timestamp的地方换个方式实现取时间戳
def normalize(dt):
#return datetime.fromtimestamp(dt.timestamp(), dt.tzinfo)
import time
return datetime.fromtimestamp(time.mktime(dt.timetuple()), dt.tzinfo)