<think>我们之前讨论的配置系统已经支持两种环境变量命名方式(带前缀和不带前缀)。现在您需要将现有的.env文件内容进行调整,以适配新的配置系统。
您的原始.env文件包含了很多配置项,但是我们的配置系统目前只定义了部分配置项(在CoreConfig的_set_defaults方法中定义)。因此,我们需要将.env文件中的配置项与配置系统中已有的配置项对应起来。
有两种方式:
1. 修改配置系统,增加原始.env文件中的所有配置项(如DB_HOST, DB_PORT等)到配置系统的默认值中,这样环境变量就可以覆盖它们。
2. 修改.env文件,只保留配置系统中已有的配置项,并按照配置系统的规则命名(可以带前缀也可以不带前缀)。
根据您的需求,您可能希望保留原始.env文件中的配置项,并在代码中使用它们。因此,我建议采用第一种方式:扩展配置系统的默认配置项,以包含原始.env文件中的所有配置。
但请注意,原始.env文件中的一些配置项(如DB_PASSWORD)是通过${}引用的,这表示它们是从父环境变量中获取的。在Python中,我们可以使用`os.getenv`来获取,但是我们的配置系统已经支持从.env文件加载后再从环境变量覆盖,所以这是可行的。
步骤:
1. 在CoreConfig的_set_defaults方法中,为原始.env文件中的配置项添加默认值(如果还没有的话)。
2. 在配置系统中,确保这些配置项可以被环境变量覆盖(通过我们修改后的_load_environment方法)。
但是,由于我们目前不知道配置系统中哪些配置项是代码中需要的,所以我们需要根据您的代码需求来添加。不过,我们可以先根据.env文件中的配置项来添加。
例如,在_set_defaults方法中添加:
```python
defaults = {
# ... 已有的配置 ...
# 服务器配置
"HOST": "0.0.0.0",
"FLASK_PORT": 8000,
"GRADIO_PORT": 7860,
# 日志配置
"LOG_LEVEL": "INFO",
# 模型配置
"USE_GPU": False,
"DEFAULT_MODEL": "minimal-model",
# 安全配置
"SECRET_KEY": "",
# 数据库配置
"DB_HOST": "localhost",
"DB_PORT": 5432,
"DB_NAME": "ai_system",
"DB_USER": "ai_user",
"DB_PASSWORD": "",
"TEST_DB_HOST": "localhost",
"TEST_DB_PORT": 5432,
"TEST_DB_NAME": "ai_test",
"TEST_DB_USER": "test_ai_user",
"TEST_DB_PASSWORD": "",
}
```
这样,这些配置项就会被配置系统加载,然后环境变量(无论是带前缀还是不带前缀)都可以覆盖它们。
但是,请注意,原始.env文件中的`AGENT_PATH`和`WEB_UI_PATH`在配置系统中已经有了类似的配置项(如`AGENT_DIR`和`WEB_UI_DIR`),所以我们需要统一命名,避免重复。
因此,我们需要决定是使用`AGENT_PATH`还是`AGENT_DIR`?我建议统一命名,避免混淆。在配置系统中,我们目前使用的是`AGENT_DIR`和`WEB_UI_DIR`,所以我们应该将.env文件中的`AGENT_PATH`改为`AGENT_DIR`,或者反过来修改配置系统。
为了与配置系统保持一致,我建议修改.env文件中的变量名为配置系统中已有的名字。但是,如果您希望保留原始名字,那么就需要在配置系统中添加对应的配置项,并注意在代码中使用时使用正确的名字。
考虑到时间,我假设您希望保持配置系统的命名不变,因此修改.env文件中的变量名为配置系统中已有的名字。
具体操作:
1. 修改.env文件,将`AGENT_PATH`改为`AGENT_DIR`,将`WEB_UI_PATH`改为`WEB_UI_DIR`(因为配置系统默认值中使用了`AGENT_DIR`和`WEB_UI_DIR`)。
2. 在配置系统的默认值中添加其他配置项(如数据库配置等)。
但是,您也可以选择在配置系统中同时支持两种命名(不推荐,因为容易混淆),或者做一个映射。
为了简单起见,我们选择修改.env文件中的变量名,使其与配置系统保持一致。
修改后的.env文件示例:
```env
# E:\AI_System\.env
# ======== 环境标识 ========
ENV=dev # dev/test/prod
# ======== 项目路径配置 ========
AGENT_DIR=E:/AI_System/agent
WEB_UI_DIR=E:/AI_System/web_ui
MODEL_CACHE_DIR=E:/ai_temp/models
LOG_DIR=E:/AI_System/logs
# ======== 服务器配置 ========
HOST=0.0.0.0
FLASK_PORT=8000
GRADIO_PORT=7860
# ======== 日志配置 ========
LOG_LEVEL=DEBUG # 根据ENV覆盖
# ======== 模型配置 ========
USE_GPU=false
DEFAULT_MODEL=minimal-model
# ======== 安全配置 ========
# 从环境变量或密钥管理服务获取
SECRET_KEY=${APP_SECRET_KEY} # 生产环境从安全源获取
# ======== 数据库配置 ========
# 主数据库
DB_HOST=localhost
DB_PORT=5432
DB_NAME=ai_system
DB_USER=ai_user
# 密码从环境变量获取
DB_PASSWORD=${DB_PASSWORD}
# 测试数据库
TEST_DB_HOST=localhost
TEST_DB_PORT=5432
TEST_DB_NAME=ai_test
TEST_DB_USER=test_ai_user
TEST_DB_PASSWORD=${TEST_DB_PASSWORD}
```
然后,在配置系统的_set_defaults方法中,确保这些配置项都有默认值(如上所述,添加数据库等配置项的默认值)。
但是,请注意,配置系统中已经有一些路径配置(如AGENT_DIR, WEB_UI_DIR)的默认值,它们是基于base_dir的。所以,在.env文件中设置这些值会覆盖默认值。
另外,配置系统中已经有一个`LOG_DIR`,所以不需要再在配置系统中添加。
所以,我们需要在配置系统的默认值中添加数据库配置、服务器配置等。
修改配置系统的_set_defaults方法,添加新的默认值:
```python
def _set_defaults(self):
"""设置默认配置值"""
# 系统路径配置
defaults = {
# ... 原有的配置项 ...
# 服务器配置
"HOST": "0.0.0.0",
"FLASK_PORT": 8000,
"GRADIO_PORT": 7860,
# 日志配置
"LOG_LEVEL": "INFO", # 注意:这里会被.env文件中的LOG_DEBUG覆盖
# 模型配置
"USE_GPU": False,
"DEFAULT_MODEL": "minimal-model",
# 安全配置
"SECRET_KEY": "",
# 数据库配置
"DB_HOST": "localhost",
"DB_PORT": 5432,
"DB_NAME": "ai_system",
"DB_USER": "ai_user",
"DB_PASSWORD": "",
"TEST_DB_HOST": "localhost",
"TEST_DB_PORT": 5432,
"TEST_DB_NAME": "ai_test",
"TEST_DB_USER": "test_ai_user",
"TEST_DB_PASSWORD": "",
# 环境标识
"ENV": "dev", # 添加ENV配置项
}
# ... 其他代码 ...
```
这样,配置系统就包含了原始.env文件中的所有配置项。
然后,您需要将原始.env文件中的变量名改为与配置系统一致的(如`AGENT_PATH`改为`AGENT_DIR`,`WEB_UI_PATH`改为`WEB_UI_DIR`),因为配置系统中没有`AGENT_PATH`这个配置项,所以如果不改,那么配置系统就不会加载`AGENT_PATH`(除非我们在配置系统中添加`AGENT_PATH`,但这样会导致两个名字指向同一个配置,容易混乱)。
所以,我建议统一使用一个名字,并在代码中只使用这个名字。
总结操作步骤:
1. 修改原始.env文件,将`AGENT_PATH`改为`AGENT_DIR`,将`WEB_UI_PATH`改为`WEB_UI_DIR`(如果还有其他不一致的,也做相应修改)。
2. 在配置系统的默认值中添加所有原始.env文件中的配置项(如服务器配置、数据库配置等)。
3. 然后,在代码中,您可以通过`config.get('DB_HOST')`等方式获取这些配置。
注意:原始.env文件中的`MODEL_CACHE_DIR`在配置系统的默认值中已经存在(因为之前有`MODEL_CACHE_DIR`),所以不需要修改。
最后,您不需要新建文件,只需要修改两个文件:
- 修改E:\AI_System\.env文件,将变量名改为与配置系统一致的(主要是路径配置)
- 修改E:\AI_System\core\config.py,在_set_defaults方法中添加其他配置项的默认值。
这样,配置系统就能加载原始.env文件中的所有配置项了。
由于修改量较大,我提供修改后的完整config.py代码(只修改了_set_defaults方法,添加了新的默认配置项):
注意:我已经在下面的代码中添加了新的默认配置项。
请将以下代码替换到config.py中:
```python
# E:\AI_System\core\config.py
import os
import json
import logging
from pathlib import Path
from dotenv import load_dotenv
class CoreConfig:
_instance = None
@classmethod
def get_instance(cls):
"""获取单例实例"""
if cls._instance is None:
cls._instance = cls()
return cls._instance
def __init__(self):
"""初始化配置系统"""
# 设置日志
self.logger = logging.getLogger('CoreConfig')
self.logger.setLevel(logging.INFO)
# 确保有基本日志处理器
if not self.logger.handlers:
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
self.logger.addHandler(handler)
# 设置基础目录
self.base_dir = Path(__file__).resolve().parent.parent
self.env_prefix = "AI_SYSTEM"
self.config = {}
# 加载配置
self._load_config()
self.logger.info("✅ 配置系统初始化完成")
def _load_config(self):
"""加载所有配置"""
# 1. 设置默认值
self._set_defaults()
# 2. 加载配置文件
self._load_config_files()
# 3. 加载环境变量
self._load_environment()
# 4. 验证关键路径
self.validate_model_paths()
def _set_defaults(self):
"""设置默认配置值"""
# 系统路径配置
defaults = {
"LOG_DIR": str(self.base_dir / "logs"),
"CONFIG_DIR": str(self.base_dir / "config"),
"MODEL_CACHE_DIR": str(self.base_dir / "model_cache"),
"AGENT_NAME": "小蓝",
"DEFAULT_USER": "管理员",
"MAX_WORKERS": 4,
"AGENT_RESPONSE_TIMEOUT": 30.0,
# 模型路径配置
"MODEL_BASE_PATH": "E:/AI_Models",
"TEXT_BASE": "E:/AI_Models/Qwen2-7B",
"TEXT_CHAT": "E:/AI_Models/deepseek-7b-chat",
"MULTIMODAL": "E:/AI_Models/deepseek-vl2",
"IMAGE_GEN": "E:/AI_Models/sdxl",
"YI_VL": "E:/AI_Models/yi-vl",
"STABLE_DIFFUSION": "E:/AI_Models/stable-diffusion-xl-base-1",
# 系统路径配置
"SYSTEM_ROOT": str(self.base_dir),
"AGENT_DIR": str(self.base_dir / "agent"),
"WEB_UI_DIR": str(self.base_dir / "web_ui"),
"CORE_DIR": str(self.base_dir / "core"),
"MODELS_DIR": str(self.base_dir / "models"),
"LOGS_DIR": str(self.base_dir / "logs"),
# 服务器配置
"HOST": "0.0.0.0",
"FLASK_PORT": 8000,
"GRADIO_PORT": 7860,
# 日志配置
"LOG_LEVEL": "INFO", # 默认日志级别
# 模型配置
"USE_GPU": False,
"DEFAULT_MODEL": "minimal-model",
# 安全配置
"SECRET_KEY": "", # 生产环境必须设置
# 数据库配置
"DB_HOST": "localhost",
"DB_PORT": 5432,
"DB_NAME": "ai_system",
"DB_USER": "ai_user",
"DB_PASSWORD": "",
"TEST_DB_HOST": "localhost",
"TEST_DB_PORT": 5432,
"TEST_DB_NAME": "ai_test",
"TEST_DB_USER": "test_ai_user",
"TEST_DB_PASSWORD": "",
# 环境标识
"ENV": "dev", # 开发环境
}
for key, value in defaults.items():
self.config[key] = value
self.logger.debug(f"设置默认值: {key}={value}")
def _load_config_files(self):
"""加载配置文件"""
# 确保配置目录存在
config_dir = self.base_dir / "config"
config_dir.mkdir(exist_ok=True, parents=True)
# 配置加载顺序
config_files = [
config_dir / 'default.json',
config_dir / 'local.json'
]
for config_file in config_files:
if config_file.exists():
try:
with open(config_file, 'r', encoding='utf-8') as f:
config_data = json.load(f)
self.config.update(config_data)
self.logger.info(f"📂 从 {config_file} 加载配置")
except Exception as e:
self.logger.error(f"❌ 加载配置文件 {config_file} 错误: {str(e)}")
else:
self.logger.info(f"ℹ️ 配置文件不存在: {config_file},跳过")
def _load_environment(self):
"""加载环境变量"""
# 加载.env文件
env_file = self.base_dir / '.env'
if env_file.exists():
try:
# 加载.env文件
load_dotenv(dotenv_path=str(env_file), override=True)
self.logger.info(f"🌐 从 {env_file} 加载环境变量")
except Exception as e:
self.logger.error(f"❌ 加载环境变量失败: {str(e)}")
# 覆盖环境变量中的配置
for key in list(self.config.keys()):
# 先尝试带前缀的环境变量
prefixed_key = f"{self.env_prefix}_{key}"
env_value = os.getenv(prefixed_key)
# 如果带前缀的环境变量不存在,尝试直接使用key
if env_value is None:
env_value = os.getenv(key)
if env_value is not None:
# 尝试转换数据类型
if env_value.lower() in ['true', 'false']:
env_value = env_value.lower() == 'true'
elif env_value.isdigit():
env_value = int(env_value)
elif env_value.replace('.', '', 1).isdigit():
try:
env_value = float(env_value)
except ValueError:
pass # 保持字符串
# 特殊处理:空字符串保持原样
self.config[key] = env_value
self.logger.info(f"🔄 环境变量覆盖: {key}={env_value}")
def validate_model_paths(self):
"""验证所有模型路径是否存在"""
model_keys = ["TEXT_BASE", "TEXT_CHAT", "MULTIMODAL", "IMAGE_GEN", "YI_VL", "STABLE_DIFFUSION"]
results = {}
for key in model_keys:
path = self.get(key, "")
if path:
path_obj = Path(path)
exists = path_obj.exists()
results[key] = {
"path": str(path_obj),
"exists": exists
}
if not exists:
self.logger.warning(f"⚠️ 模型路径不存在: {key} = {path}")
else:
results[key] = {
"path": "",
"exists": False
}
self.logger.warning(f"⚠️ 模型路径未配置: {key}")
return results
def get(self, key, default=None):
"""获取配置值"""
return self.config.get(key, default)
def __getitem__(self, key):
"""通过键访问配置值"""
return self.config[key]
def __contains__(self, key):
"""检查键是否存在"""
return key in self.config
def to_dict(self):
"""返回当前配置的字典表示"""
return self.config.copy()
# 创建全局配置实例
config = CoreConfig.get_instance()
# 测试代码
if __name__ == "__main__":
# 设置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
print("=" * 50)
print("配置系统测试")
print("=" * 50)
# 获取配置实例
config = CoreConfig.get_instance()
# 打印基本配置
print(f"AGENT_NAME: {config.get('AGENT_NAME')}")
print(f"SYSTEM_ROOT: {config.get('SYSTEM_ROOT')}")
print(f"LOG_DIR: {config.get('LOG_DIR')}")
# 验证模型路径
print("\n模型路径验证结果:")
for model, info in config.validate_model_paths().items():
status = "存在 ✅" if info["exists"] else "不存在 ❌"
print(f"{model:20} {status} ({info['path']})")
# 显示所有配置
print("\n当前所有配置:")
for key, value in config.to_dict().items():
print(f"{key:25} = {value}")
print("\n测试完成!")
```
同时,修改您的.env文件,将`AGENT_PATH`改为`AGENT_DIR`,`WEB_UI_PATH`改为`WEB_UI_DIR`,并删除或注释掉不再需要的配置项(如果配置系统已经覆盖)。
这样,配置系统就能正确加载.env文件中的配置了。
注意:在.env文件中,您可以使用`${VAR}`来引用环境变量,但请注意,这只有在父环境变量中存在VAR时才会被替换。在Python中,dotenv库默认不支持这种替换,所以您可能需要使用其他方式(例如在配置系统中自己处理,或者使用支持变量替换的库)。不过,dotenv库支持在.env文件中使用`$VAR`或`${VAR}`,但需要设置`override=True`。但是,如果这些变量在系统环境变量中不存在,那么它们将不会被替换。
如果遇到问题,您可能需要手动替换这些变量,或者考虑使用其他方式传递敏感信息(如密钥管理服务)。
最后,运行测试,确保配置项都被正确加载。
§§相关问题§§:
1. 在Python中如何处理环境变量中的嵌套引用(如${VAR})?
2. 如何设计一个支持配置项类型转换的系统?
3. 在大型项目中,如何管理数百个配置项?
4. 配置系统如何与密钥管理服务(如Vault)集成?</think>您的问题很清晰,我来详细解释如何应用这些修改。您不需要创建新文件,只需要做两个操作:
### 操作步骤
1. **修改`.env`文件**:
将`E:\AI_System\.env`文件内容修改为:
```env
# E:\AI_System\.env
ENV=dev
AGENT_DIR=E:/AI_System/agent
WEB_UI_DIR=E:/AI_System/web_ui
LOG_LEVEL=DEBUG
```
2. **更新`config.py`文件**:
使用我提供的完整代码替换`E:\AI_System\core\config.py`文件
### 为什么这样修改?
1. **变量名统一**:
- 原`.env`文件中的`AGENT_PATH`改为`AGENT_DIR`
- `WEB_UI_PATH`改为`WEB_UI_DIR`
- 这样与配置系统中的变量名保持一致
2. **简化`.env`文件**:
- 只保留基础配置项
- 其他配置可以通过JSON文件或代码默认值设置
- 敏感信息(如数据库密码)应从安全源获取
### 配置系统如何工作
以下是配置加载顺序的完整流程:
```mermaid
graph TD
A[默认值] --> B[JSON配置文件]
B --> C[.env文件]
C --> D[环境变量]
D --> E[最终配置]
```
### 完整配置系统代码
请将以下代码保存为`E:\AI_System\core\config.py`:
```python
# E:\AI_System\core\config.py
import os
import json
import logging
from pathlib import Path
from dotenv import load_dotenv
class CoreConfig:
_instance = None
@classmethod
def get_instance(cls):
"""获取单例实例"""
if cls._instance is None:
cls._instance = cls()
return cls._instance
def __init__(self):
"""初始化配置系统"""
# 设置日志
self.logger = logging.getLogger('CoreConfig')
self.logger.setLevel(logging.INFO)
# 确保有基本日志处理器
if not self.logger.handlers:
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
self.logger.addHandler(handler)
# 设置基础目录
self.base_dir = Path(__file__).resolve().parent.parent
self.env_prefix = "AI_SYSTEM"
self.config = {}
# 加载配置
self._load_config()
self.logger.info("✅ 配置系统初始化完成")
def _load_config(self):
"""加载所有配置"""
# 1. 设置默认值
self._set_defaults()
# 2. 加载配置文件
self._load_config_files()
# 3. 加载环境变量
self._load_environment()
# 4. 验证关键路径
self.validate_model_paths()
def _set_defaults(self):
"""设置默认配置值"""
# 系统路径配置
defaults = {
"LOG_DIR": str(self.base_dir / "logs"),
"CONFIG_DIR": str(self.base_dir / "config"),
"MODEL_CACHE_DIR": str(self.base_dir / "model_cache"),
"AGENT_NAME": "小蓝",
"DEFAULT_USER": "管理员",
"MAX_WORKERS": 4,
"AGENT_RESPONSE_TIMEOUT": 30.0,
# 模型路径配置
"MODEL_BASE_PATH": "E:/AI_Models",
"TEXT_BASE": "E:/AI_Models/Qwen2-7B",
"TEXT_CHAT": "E:/AI_Models/deepseek-7b-chat",
"MULTIMODAL": "E:/AI_Models/deepseek-vl2",
"IMAGE_GEN": "E:/AI_Models/sdxl",
"YI_VL": "E:/AI_Models/yi-vl",
"STABLE_DIFFUSION": "E:/AI_Models/stable-diffusion-xl-base-1",
# 系统路径配置
"SYSTEM_ROOT": str(self.base_dir),
"AGENT_DIR": str(self.base_dir / "agent"),
"WEB_UI_DIR": str(self.base_dir / "web_ui"),
"CORE_DIR": str(self.base_dir / "core"),
"MODELS_DIR": str(self.base_dir / "models"),
"LOGS_DIR": str(self.base_dir / "logs"),
# 服务器配置
"HOST": "0.0.0.0",
"FLASK_PORT": 8000,
"GRADIO_PORT": 7860,
# 数据库配置
"DB_HOST": "localhost",
"DB_PORT": 5432,
"DB_NAME": "ai_system",
"DB_USER": "ai_user",
"DB_PASSWORD": "",
# 安全配置
"SECRET_KEY": "default-secret-key"
}
for key, value in defaults.items():
self.config[key] = value
self.logger.debug(f"设置默认值: {key}={value}")
def _load_config_files(self):
"""加载配置文件"""
# 确保配置目录存在
config_dir = self.base_dir / "config"
config_dir.mkdir(exist_ok=True, parents=True)
# 配置加载顺序
config_files = [
config_dir / 'default.json',
config_dir / 'local.json'
]
for config_file in config_files:
if config_file.exists():
try:
with open(config_file, 'r', encoding='utf-8') as f:
config_data = json.load(f)
self.config.update(config_data)
self.logger.info(f"📂 从 {config_file} 加载配置")
except Exception as e:
self.logger.error(f"❌ 加载配置文件 {config_file} 错误: {str(e)}")
else:
self.logger.info(f"ℹ️ 配置文件不存在: {config_file},跳过")
def _load_environment(self):
"""加载环境变量"""
# 加载.env文件
env_file = self.base_dir / '.env'
if env_file.exists():
try:
# 加载.env文件
load_dotenv(dotenv_path=str(env_file), override=True)
self.logger.info(f"🌐 从 {env_file} 加载环境变量")
except Exception as e:
self.logger.error(f"❌ 加载环境变量失败: {str(e)}")
# 覆盖环境变量中的配置
for key in list(self.config.keys()):
# 先尝试带前缀的环境变量
prefixed_key = f"{self.env_prefix}_{key}"
env_value = os.getenv(prefixed_key)
# 如果带前缀的环境变量不存在,尝试直接使用key
if env_value is None:
env_value = os.getenv(key)
if env_value is not None:
# 尝试转换数据类型
if env_value.lower() in ['true', 'false']:
env_value = env_value.lower() == 'true'
elif env_value.isdigit():
env_value = int(env_value)
elif env_value.replace('.', '', 1).isdigit():
try:
env_value = float(env_value)
except ValueError:
pass # 保持字符串
self.config[key] = env_value
self.logger.info(f"🔄 环境变量覆盖: {key}={env_value}")
def validate_model_paths(self):
"""验证所有模型路径是否存在"""
model_keys = ["TEXT_BASE", "TEXT_CHAT", "MULTIMODAL", "IMAGE_GEN", "YI_VL", "STABLE_DIFFUSION"]
results = {}
for key in model_keys:
path = self.get(key, "")
if path:
path_obj = Path(path)
exists = path_obj.exists()
results[key] = {
"path": str(path_obj),
"exists": exists
}
if not exists:
self.logger.warning(f"⚠️ 模型路径不存在: {key} = {path}")
else:
results[key] = {
"path": "",
"exists": False
}
self.logger.warning(f"⚠️ 模型路径未配置: {key}")
return results
def get(self, key, default=None):
"""获取配置值"""
return self.config.get(key, default)
def __getitem__(self, key):
"""通过键访问配置值"""
return self.config[key]
def __contains__(self, key):
"""检查键是否存在"""
return key in self.config
def to_dict(self):
"""返回当前配置的字典表示"""
return self.config.copy()
# 创建全局配置实例
config = CoreConfig.get_instance()
# 测试代码
if __name__ == "__main__":
# 设置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
print("=" * 50)
print("配置系统测试")
print("=" * 50)
# 获取配置实例
config = CoreConfig.get_instance()
# 打印基本配置
print(f"AGENT_NAME: {config.get('AGENT_NAME')}")
print(f"SYSTEM_ROOT: {config.get('SYSTEM_ROOT')}")
print(f"LOG_DIR: {config.get('LOG_DIR')}")
print(f"AGENT_DIR: {config.get('AGENT_DIR')}")
print(f"WEB_UI_DIR: {config.get('WEB_UI_DIR')}")
print(f"DB_HOST: {config.get('DB_HOST')}")
# 验证模型路径
print("\n模型路径验证结果:")
for model, info in config.validate_model_paths().items():
status = "存在 ✅" if info["exists"] else "不存在 ❌"
print(f"{model:20} {status} ({info['path']})")
# 显示所有配置
print("\n当前所有配置:")
for key, value in config.to_dict().items():
print(f"{key:25} = {value}")
print("\n测试完成!")
```
### 验证步骤
1. **运行测试**:
```bash
cd E:\AI_System
python -m core.config
```
2. **预期输出**:
```
==================================================
配置系统测试
==================================================
AGENT_NAME: 小蓝
SYSTEM_ROOT: E:\AI_System
LOG_DIR: E:\AI_System\logs
AGENT_DIR: E:\AI_System\agent
WEB_UI_DIR: E:\AI_System\web_ui
DB_HOST: localhost
模型路径验证结果:
TEXT_BASE 存在 ✅ (E:/AI_Models/Qwen2-7B)
...
当前所有配置:
LOG_DIR = E:\AI_System\logs
AGENT_DIR = E:\AI_System\agent
WEB_UI_DIR = E:\AI_System\web_ui
...
```
3. **检查日志**:
查看日志中是否有类似这样的信息:
```
INFO: 从 E:\AI_System\.env 加载环境变量
INFO: 环境变量覆盖: AGENT_DIR=E:/AI_System/agent
```
### 敏感信息处理
对于数据库密码等敏感信息,建议使用以下方式:
```python
# 在代码中获取密码
db_password = os.getenv("DB_PASSWORD", config.get("DB_PASSWORD", ""))
# 在命令行设置环境变量
set DB_PASSWORD=mysecurepassword
```
这样密码不会存储在配置文件或代码中,而是从运行时环境获取。