Django运行testapscheduler.py遇ModuleNotFoundError: No module named 'config'求助
解决ModuleNotFoundError: No module named 'config'问题
核心问题分析
你的代码中添加项目根目录到Python路径的操作时机错误,导致Django初始化时无法找到config模块;同时存在模型导入路径错误的问题。
具体修复步骤
1. 调整路径添加的位置
将sys.path.append移到导入Django之前,确保Django加载配置时能找到config模块:
import os import sys # 先把项目根目录加入Python搜索路径 sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')) import django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') django.setup()
2. 修正模型导入路径
从项目结构来看,Todo模型属于todo应用,因此导入语句需要改为:
from todo.models import Todo
3. 可选:用绝对路径增强稳定性
如果相对路径仍有问题,可以直接计算项目根目录的绝对路径添加:
current_script_dir = os.path.dirname(os.path.abspath(__file__)) # 假设脚本在项目根目录的子文件夹中,比如scripts project_root_dir = os.path.dirname(current_script_dir) sys.path.append(project_root_dir)
4. 规范运行方式
建议在项目根目录下运行脚本,避免路径混乱:
python scripts/testapscheduler.py # 假设脚本放在scripts目录下
修复后的完整代码示例
import os import sys # 添加项目根目录到Python搜索路径 sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')) import django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') django.setup() import logging from todo.models import Todo from apscheduler.schedulers.background import BackgroundScheduler, BlockingScheduler from datetime import datetime, timedelta import pytz import requests from django.conf import settings def notify_todo(): # 取得当前时间 now = datetime.now(pytz.timezone('Asia/Tokyo')) # 获取截止时间在30分钟以内的TODO列表 todos = Todo.objects.filter( deadline__gt=now - timedelta(minutes=30), deadline__lt=now + timedelta(minutes=30), ttime__isnull=False, ttime__gt=now.time() ) # 输出30分钟以内的TODO列表数量 logger = logging.getLogger('mylog') logger.setLevel(logging.DEBUG) sh = logging.StreamHandler() logger.addHandler(sh) logger.debug(f'{len(todos)}个TODO列表的截止时间在30分钟以内。') for todo in todos: # 获取LINE Notify的API令牌 api_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # 创建通知消息 message = f"【{todo.title}】\n截止时间:{todo.deadline.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 = BlockingScheduler(timezone='Asia/Tokyo') scheduler.add_job(notify_todo, 'interval', seconds=2) # 每2秒执行一次 scheduler.start()
内容的提问来源于stack exchange,提问作者snb
相关产品推荐
相关产品推荐

