已安装APScheduler仍报ModuleNotFoundError,Django+Python3.11环境求助
问题排查与解决:ModuleNotFoundError: No module named 'apscheduler.schedulers'
问题根源
你的Django应用中存在一个名为apscheduler.py的文件,与第三方库APScheduler的包名完全冲突。Python导入模块时会优先搜索当前目录下的文件,导致代码尝试导入你自己编写的apscheduler.py,而非系统中安装的APScheduler库,因此出现找不到schedulers子模块的错误。
解决方案
1. 重命名冲突文件
将你自己编写的apscheduler.py文件重命名为不与第三方库重名的名称,例如apscheduler_tasks.py。
2. 修正导入路径与代码逻辑
原代码存在两个额外问题:一是apps.py中尝试导入不存在的start函数,二是直接在模块级别启动调度器可能导致Django启动时重复初始化。以下是修正后的代码:
修正后的apscheduler_tasks.py
from apscheduler.schedulers.background import BackgroundScheduler from datetime import datetime, timedelta import pytz import requests from .models import Todo def notify_todo(): # 获取当前东京时区时间 now = datetime.now(pytz.timezone('Asia/Tokyo')) # 计算24小时后的日期(适配DateField类型) end_date = now + timedelta(days=1) # 筛选截止日期在未来24小时内的任务 todos = Todo.objects.filter(deadline__range=(now.date(), end_date.date())) for todo in todos: api_token = 'xxxxxxxxxxxxxxxxxxxx' # 合并日期与时间字段,生成完整截止时间 deadline_full = datetime.combine(todo.deadline, todo.ttime) message = f"【{todo.title}】\n截止时间:{deadline_full.strftime('%Y/%m/%d %H:%M')}\n详情:{todo.description}" # 发送LINE Notify通知 headers = {'Authorization': f'Bearer {api_token}'} payload = {'message': message} requests.post('https://notify-api.line.me/api/notify', headers=headers, data=payload) # 初始化调度器 scheduler = BackgroundScheduler(timezone='Asia/Tokyo') def start(): # 避免重复添加任务(适配Django ready方法可能多次执行的场景) if not scheduler.get_job('todo_notify_job'): scheduler.add_job(notify_todo, 'interval', minutes=10, id='todo_notify_job') scheduler.start()
修正后的apps.py
from django.apps import AppConfig class TodoConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'todo' def ready(self): from .apscheduler_tasks import start start()
3. 额外注意事项
- 确认APScheduler已正确安装:执行
pip install apscheduler或pip show apscheduler验证安装状态。 - 原代码中
deadline为DateField类型,直接与datetime对象做范围过滤会有类型不匹配问题,已修正为基于日期的筛选逻辑。
内容的提问来源于stack exchange,提问作者snb
相关产品推荐
相关产品推荐

