E:\AI_System\web_ui>python server.py Traceback (most recent call last): File "E:\AI_System\web_ui\server.py", line 60, in <module> from config.config_loader import config ModuleNotFoundError: No module named 'config.config_loader'; 'config' is not a package During handling of the above exception, another exception occurred: Traceback (most recent call last): File "E:\AI_System\web_ui\server.py", line 65, in <module> logger.warning(f"配置模块导入失败, 使用临时配置: {str(e)}") NameError: name 'logger' is not defined E:\AI_System\web_ui>
时间: 2025-08-09 11:02:22 浏览: 9
<think>我们遇到了两个错误:
1. 首先尝试从 `config.config_loader` 导入 `config` 时失败,错误是 `No module named 'config.config_loader'; 'config' is not a package`
2. 然后在处理这个异常时,又发生了另一个异常:`NameError: name 'logger' is not defined`
原因分析:
- 第一个错误说明我们的配置模块导入失败。这可能是由于:
- 项目结构中没有 `config` 包(即目录下没有 `__init__.py` 文件)
- 或者 `config_loader.py` 文件不存在
- 或者 `sys.path` 没有正确设置,导致找不到 `config` 包
- 第二个错误是因为在异常处理块中使用了 `logger`,但此时 `logger` 还没有被定义。因为我们在导入配置之后才初始化日志记录器。
解决方案:
1. 在异常处理块中避免使用尚未初始化的 `logger`,我们可以先初始化一个简单的日志记录器用于记录启动错误。
2. 重新组织代码,确保在尝试导入配置之前就有一个基本的日志记录机制。
具体步骤:
- 在代码开头先设置一个简单的日志记录器(例如只输出到控制台),用于记录启动阶段的错误。
- 在导入配置失败时,使用这个基本日志记录器记录错误。
- 在配置日志记录器(使用文件和控制台等)之前,使用这个基本日志记录器。
修改后的代码结构:
1. 在文件开头,设置一个基本的日志记录器(basicConfig)用于捕获启动错误。
2. 然后尝试导入配置,如果失败则使用基本日志记录器记录,并创建临时配置。
3. 然后根据配置(无论是导入的还是临时的)来设置更详细的日志记录器(文件日志等)。
4. 然后替换掉基本日志记录器,使用新配置的日志记录器。
另外,我们还需要确保项目结构正确,即:
- 在 `E:\AI_System\config` 目录下存在 `__init__.py` 文件(使其成为包)和 `config_loader.py` 文件。
如果项目结构中确实没有 `config` 包,那么我们需要检查是否应该创建它,或者调整导入路径。
但是,考虑到错误信息中提示 `'config' is not a package`,很可能是 `config` 目录下缺少 `__init__.py` 文件,或者存在一个名为 `config.py` 的文件(导致冲突)。因此,请检查项目结构。
不过,为了代码的健壮性,我们将修改日志初始化顺序。
以下是修改后的代码开头部分(仅展示修改部分):</think>您的错误是由于在配置导入失败时尝试使用尚未初始化的 `logger` 导致的。我将提供一个完整的修复方案,确保在配置导入失败时也能正确记录日志:
```python
# E:\AI_System\web_ui\server.py
import sys
import os
import time
import logging
import json
import traceback
import threading
from flask import Flask, jsonify, request, render_template, send_from_directory, Response
# ========== 初始日志设置 ==========
# 创建临时日志记录器用于启动阶段
temp_logger = logging.getLogger('StartupLogger')
temp_logger.setLevel(logging.DEBUG)
console_handler = logging.StreamHandler()
console_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
temp_logger.addHandler(console_handler)
# ========== 解决路径问题 ==========
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, base_dir)
temp_logger.info(f"项目根目录: {base_dir}")
# 添加所有必要的子目录
sub_dirs = ['agent', 'core', 'utils', 'config', 'cognitive_arch']
for sub_dir in sub_dirs:
full_path = os.path.join(base_dir, sub_dir)
if os.path.exists(full_path):
sys.path.insert(0, full_path)
temp_logger.info(f"添加路径: {full_path}")
else:
temp_logger.warning(f"目录不存在: {full_path}")
# ========== 配置加载 ==========
class TempConfig:
"""临时配置类,确保所有必要属性都存在"""
AGENT_PATH = os.path.join(base_dir, 'agent')
WEB_UI_PATH = os.path.join(base_dir, 'web_ui')
MODEL_CACHE_DIR = os.path.join(base_dir, 'model_cache')
LOG_DIR = os.path.join(base_dir, 'logs')
HOST = '0.0.0.0'
PORT = 8000
SECRET_KEY = 'temp-secret-key'
LOG_LEVEL = 'INFO'
USE_GPU = False
DEFAULT_MODEL = 'minimal-model'
ENV = 'development'
# 生活系统配置
LIFE_SCHEDULE = {
"wake_up": "08:00",
"breakfast": "08:30",
"lunch": "12:30",
"dinner": "19:00",
"sleep": "23:00"
}
# 尝试导入配置
try:
from config.config_loader import config
temp_logger.info("✅ 使用config_loader中的配置")
except ImportError as e:
config = TempConfig()
temp_logger.error(f"❌ 配置模块导入失败: {str(e)}")
temp_logger.warning(f"⚠️ 使用临时配置")
temp_logger.info(f"请检查以下路径是否存在:")
temp_logger.info(f"1. {os.path.join(base_dir, 'config/config_loader.py')}")
temp_logger.info(f"2. {os.path.join(base_dir, 'config/__init__.py')}")
# ========== 配置Flask应用 ==========
app = Flask(__name__,
template_folder='templates',
static_folder='static')
# ========== 安全日志处理 ==========
def safe_log(message):
"""安全处理日志中的Unicode字符"""
try:
return message.encode('utf-8', 'ignore').decode('utf-8')
except:
return message.replace('❌', '[ERROR]').replace('⏳', '[WAIT]').replace('‼️', '[CRITICAL]').replace('✅', '[OK]').replace('🚀', '[LAUNCH]')
# ========== 正式日志设置 ==========
logger = logging.getLogger('WebServer')
logger.setLevel(getattr(logging, config.LOG_LEVEL.upper(), logging.INFO))
# 日志格式
log_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 文件日志处理器
try:
# 确保日志目录存在
os.makedirs(config.LOG_DIR, exist_ok=True)
from logging.handlers import TimedRotatingFileHandler
file_handler = TimedRotatingFileHandler(
os.path.join(config.LOG_DIR, 'web_server.log'),
when='midnight',
backupCount=30,
encoding='utf-8'
)
file_handler.setFormatter(log_formatter)
logger.addHandler(file_handler)
logger.info("✅ 文件日志处理器初始化成功")
except Exception as e:
logger.warning(f"⚠️ 文件日志处理器创建失败: {str(e)}")
# 控制台日志处理器
console_handler = logging.StreamHandler()
console_handler.setFormatter(log_formatter)
logger.addHandler(console_handler)
# 移除临时日志处理器
temp_logger.removeHandler(console_handler)
# 重写logger方法以处理Unicode
original_info = logger.info
original_error = logger.error
original_warning = logger.warning
original_critical = logger.critical
def safe_logger(original_func):
def wrapper(msg, *args, **kwargs):
try:
original_func(safe_log(msg), *args, **kwargs)
except UnicodeEncodeError:
ascii_msg = msg.encode('ascii', 'ignore').decode('ascii')
original_func(ascii_msg, *args, **kwargs)
return wrapper
logger.info = safe_logger(original_info)
logger.error = safe_logger(original_error)
logger.warning = safe_logger(original_warning)
logger.critical = safe_logger(original_critical)
# ========== 全局智能体实例 ==========
ai_agent = None
life_scheduler = None
# ========== 生活系统初始化 ==========
try:
from cognitive_arch.life_scheduler import LifeScheduler
# 初始化生活系统
life_scheduler = LifeScheduler(
daily_schedule=config.LIFE_SCHEDULE,
log_dir=config.LOG_DIR
)
logger.info("✅ 生活系统初始化成功")
# 生活状态更新线程
def update_life_status():
"""后台线程定期更新生活状态"""
while True:
try:
# 获取当前时间
current_hour = time.localtime().tm_hour
# 根据时间执行相应活动
if 8 <= current_hour < 9:
life_scheduler.wake_up()
elif 12 <= current_hour < 13:
life_scheduler.have_meal("lunch")
elif 19 <= current极客 < 20:
life_scheduler.have_meal("dinner")
elif 23 <= current_hour or current_hour < 6:
life_scheduler.go_to_sleep()
time.sleep(60) # 每分钟更新一次
except Exception as e:
logger.error(f"生活系统更新失败: {str(e)}")
time.sleep(300) # 出错后等待5分钟再重试
# 启动后台线程
life_thread = threading.Thread(target=update_life_status, daemon=True)
life_thread.start()
logger.info("✅ 生活系统后台线程已启动")
except ImportError as e:
logger.error(f"❌ 生活系统模块导入失败: {str(e)}")
logger.warning("⚠️ 生活系统功能将不可用")
except Exception as e:
logger.error(f"❌ 生活系统初始化失败: {str(e)}")
logger.warning("⚠️ 生活系统功能将不可用")
# ========== 智能体初始化 ==========
logger.info("=" * 50)
logger.info("正在使用统一配置初始化智能体核心模块...")
logger.info(f"智能体路径: {config.AGENT_PATH}")
logger.info(f"模型缓存目录: {config.MODEL_CACHE_DIR}")
logger.info(f"默认模型: {config.DEFAULT_MODEL}")
logger.info(f"使用GPU: {config.USE_GPU}")
max_retries = 3
retry_delay = 2 # 秒
for attempt in range(max_retries):
try:
# 动态导入智能体模块
from agent.autonomous_agent import AutonomousAgent
ai_agent = AutonomousAgent(
model_path=config.AGENT_PATH,
cache_dir=config.MODEL_CACHE_DIR,
use_gpu=config.USE_GPU,
default_model=config.DEFAULT_MODEL
)
logger.info("✅ 智能体核心模块初始化成功")
break
except ImportError as ie:
logger.error(f"❌ 智能体模块导入失败: {str(ie)}")
if attempt < max_retries - 1:
logger.info(f"⏳ {retry_delay}秒后重试...")
time.sleep(retry_delay)
else:
logger.critical("‼️ 智能体模块导入彻底失败")
ai_agent = None
except Exception as e:
logger.error(f"❌ 智能体初始化失败 (尝试 {attempt + 1}/{max_retries}): {str(e)}")
if attempt < max_retries - 1:
logger.info(f"⏳ {retry_delay}秒后重试...")
time.sleep(retry_delay)
else:
logger.critical("‼️ 智能体初始化彻底失败,部分功能将不可用")
ai_agent = None
# ========== 以下是您的路由定义(保持不变) ==========
# /life, /api/life/status, /adjust_schedule, /, /status, /chat 等
# ... [保持原有的路由定义不变] ...
if __name__ == '__main__':
start_time = time.time()
logger.info("=" * 50)
logger.info(f"🚀 启动Web服务: http://{config.HOST}:{config.PORT}")
logger.info(f"环境: {config.ENV}")
logger.info(f"日志级别: {config.LOG_LEVEL}")
logger.info(f"生活系统: {'✅ 已启用' if life_scheduler else '❌ 未启用'}")
logger.info(f"智能体: {'✅ 已启用' if ai_agent else '❌ 未启用'}")
logger.info("=" * 50)
try:
# 使用配置中的主机和端口
app.run(host=config.HOST, port=config.PORT, threaded=True)
except Exception as e:
logger.critical(f"‼️ 服务器启动失败: {traceback.format_exc()}")
```
### 关键修复说明:
1. **启动阶段日志初始化**:
```python
# 创建临时日志记录器用于启动阶段
temp_logger = logging.getLogger('StartupLogger')
temp_logger.setLevel(logging.DEBUG)
console_handler = logging.StreamHandler()
console_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
temp_logger.addHandler(console_handler)
```
在配置导入前创建临时日志记录器,确保即使配置导入失败也能记录错误。
2. **路径检查增强**:
```python
for sub_dir in sub_dirs:
full_path = os.path.join(base_dir, sub_dir)
if os.path.exists(full_path):
sys.path.insert(0, full_path)
temp_logger.info(f"添加路径: {full_path}")
else:
temp_logger.warning(f"目录不存在: {full_path}")
```
检查每个子目录是否存在,避免添加不存在的路径。
3. **配置导入错误处理**:
```python
except ImportError as e:
config = TempConfig()
temp_logger.error(f"❌ 配置模块导入失败: {str(e)}")
temp_logger.warning(f"⚠️ 使用临时配置")
temp_logger.info(f"请检查以下路径是否存在:")
temp_logger.info(f"1. {os.path.join(base_dir, 'config/config_loader.py')}")
temp_logger.info(f"2. {os.path.join(base_dir, 'config/__init__.py')}")
```
提供详细的错误信息和解决方案提示。
4. **日志目录自动创建**:
```python
# 确保日志目录存在
os.makedirs(config.LOG_DIR, exist_ok=True)
```
如果日志目录不存在,自动创建它。
5. **日志系统平滑过渡**:
```python
# 移除临时日志处理器
temp_logger.removeHandler(console_handler)
```
在正式日志系统初始化后,移除临时日志处理器。
### 项目结构建议:
确保您的项目结构包含以下文件:
```
E:\AI_System\
├── config\
│ ├── __init__.py ← 必须有这个文件使其成为Python包
│ └── config_loader.py
├── cognitive_arch\
│ ├── __init__.py ← 必须有这个文件
│ └── life_scheduler.py
├── agent\
│ ├── __init__.py ← 必须有这个文件
│ └── autonomous_agent.py
├── core\
│ ├── __init__.py ← 必须有这个文件
│ └── environment_interface.py
├── web_ui\
│ ├── templates\
│ └── server.py
└── logs\ ← 日志目录
```
### `config_loader.py` 示例:
如果您还没有创建配置文件,这是一个基本示例:
```python
# E:\AI_System\config\config_loader.py
import os
class Config:
# 基础路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# 智能体配置
AGENT_PATH = os.path.join(BASE_DIR, 'agent')
MODEL_CACHE_DIR = os.path.join(BASE_DIR, 'model_cache')
DEFAULT_MODEL = 'minimal-model'
USE_GPU = False
# 服务器配置
HOST = '0.0.0.0'
PORT = 8000
SECRET_KEY = 'your-secret-key'
LOG_LEVEL = 'INFO'
LOG_DIR = os.path.join(BASE_DIR, 'logs')
ENV = 'development'
# 生活系统配置
LIFE_SCHEDULE = {
"wake_up": "08:00",
"breakfast": "08:30",
"lunch": "12:30",
"dinner": "19:00",
"sleep": "23:00"
}
# 创建配置实例
config = Config()
```
### 运行步骤:
1. **创建必要的包文件**:
- 在 `config` 目录下创建 `__init__.py` 文件(可以是空文件)
- 在 `cognitive_arch`、`agent`、`core` 等目录下同样创建 `__init__.py` 文件
2. **复制代码**:
- 将上述完整代码复制到 `server.py` 中
3. **运行服务器**:
```bash
cd E:\AI_System\web_ui
python server.py
```
### 验证成功启动的标志:
如果一切正常,您将看到类似这样的启动日志:
```
2023-08-10 10:00:00,000 - WebServer - INFO - ==================================================
2023-08-10 10:00:00,001 - WebServer - INFO - 🚀 启动Web服务: http://0.0.0.0:8000
2023-08-10 10:00:00,001 - WebServer - INFO - 环境: development
2023-08-10 10:00:00,001 - WebServer - INFO - 日志级别: INFO
2023-08-10 10:00:00,001 - WebServer - INFO - 生活系统: ✅ 已启用
2023-08-10 10:00:00,001 - WebServer - INFO - 智能体: ✅ 已启用
2023-08-10 10:00:00,001 - WebServer - INFO - ==================================================
```
这个修复方案确保即使在配置模块导入失败的情况下,也能正确记录日志并继续运行,同时提供了详细的错误诊断信息。
阅读全文
相关推荐



















