python笔记:2.1.5b特性_把方法变成属性

本文通过实例演示了Python中类的定义与使用,包括初始化方法、类方法、静态方法及属性的封装。深入探讨了继承机制,展示了父类与子类之间的方法重写和扩展,同时介绍了Python特有的@property装饰器实现的getter和setter方法。
# -*- coding: utf-8 -*-
"""
Created on Tue May 14 14:21:54 2019

@author: User
"""

class Human(object):
    
    domain = 'eukarya'
    def __init__(self, kingdom='Animalia',phylum='Chordata',
                order='Primates',family='Human Being'):
        self.kingdom = kingdom
        self.phylum=phylum
        self.__order = order
        self.family = family
    
    def typewrite(self):
        print('This is %s typing words!' %self.family)
    def add(self, n1, n2):
        n = n1 + n2
        print(str(n1) + '+' + str(n2) + '+' + str(n))
        print('You see! %s can calculate!' %self.family)
        
    @classmethod
    def showclassmethodinfo(cls):
        print(cls.__name__) #__name__属性,其值为类名
        print(dir(cls))    #使用dir列示本类的所有方法

    
class Female(Human):
    def __init__(self,gender='female', age = 18):
        super(Female,self).__init__() #
        self.gender=gender
    @property
    def age(self):
        return self._age
    
    @age.setter
    def age(self, age_value):
        if not isinstance(age_value, int):
            raise ValueError('年龄必须为整数型')
        if age_value < 0:
            raise ValueError('年龄必须大于等于0')
        if age_value > 150:
            raise ValueError('年龄必须小于等于150')
        self._age = age_value
    
    def add(self, n1, n2):
        '''为子类重新定义add方法'''
        n = n1 - n2
        print(str(n1) + '-' + str(n2) + '=' + str(n))
        print('你看,%s 不能使用加法计算!' %self.gender)
        
    def div(self, n1, n2):
        n = n1 / n2
        print(str(n1) + '/' + str(n2) + '=' + str(n))
        print('你看,%s 能使用除法计算!' %self.gender)       

MissLi = Female()
MissLi.age = 15
print(MissLi.age)

MissLi.age = 1500

运行:

15
Traceback (most recent call last):

  File "<ipython-input-99-afb61ea29add>", line 1, in <module>
    runfile('D:/0python/2.1.5b特性_把方法变成属性.py', wdir='D:/0python')

  File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 786, in runfile
    execfile(filename, namespace)

  File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "D:/0python/2.1.5b特性_把方法变成属性.py", line 64, in <module>
    MissLi.age = 1500

  File "D:/0python/2.1.5b特性_把方法变成属性.py", line 46, in age
    raise ValueError('年龄必须小于等于150')

ValueError: 年龄必须小于等于150

PowerShell 7 环境已加载 (版本: 7.5.2) PS C:\Users\Administrator\Desktop> # 1. 导航到项目目录 PS C:\Users\Administrator\Desktop> cd E:\AI_System PS E:\AI_System> PS E:\AI_System> # 2. 激活虚拟环境(只需执行一次) PS E:\AI_System> venv\Scripts\activate (venv) PS E:\AI_System> (venv) PS E:\AI_System> # 3. 运行环境接口测试 (venv) PS E:\AI_System> python agent\environment_interface.py 2025-08-27 23:21:48,031 - CoreConfig - INFO - 📂 从 E:\AI_System\config\default.json 加载配置: { "LOG_DIR": "E:/AI_System/logs", "CONFIG_DIR": "E:/AI_System/config", "MODEL_CACHE_DIR": "E:/AI_System/model_cache", "AGENT_NAME": "\u5c0f\u84dd", "DEFAULT_USER": "\u7ba1\u7406\u5458", "MAX_WORKERS": 4, "AGENT_RESPONSE_TIMEOUT": 30.0, "MODEL_BASE_PATH": "E:/AI_Models", "MODEL_PATHS": { "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.0" }, "NETWORK": { "HOST": "0.0.0.0", "FLASK_PORT": 8000, "GRADIO_PORT": 7860 }, "DATABASE": { "DB_HOST": "localhost", "DB_PORT": 5432, "DB_NAME": "ai_system", "DB_USER": "ai_user", "DB_PASSWORD": "secure_password_here" }, "SECURITY": { "SECRET_KEY": "generated-secret-key-here" }, "ENVIRONMENT": { "ENV": "dev", "LOG_LEVEL": "DEBUG", "USE_GPU": true }, "DIRECTORIES": { "DEFAULT_MODEL": "E:/AI_Models/Qwen2-7B", "WEB_UI_DIR": "E:/AI_System/web_ui", "AGENT_DIR": "E:/AI_System/agent", "PROJECT_ROOT": "E:/AI_System" } } 2025-08-27 23:21:48,031 - CoreConfig - INFO - 📂 从 E:\AI_System\config\local.json 加载配置: {} 2025-08-27 23:21:48,032 - CoreConfig - INFO - 🌐 从 E:\AI_System\.env 加载环境变量 2025-08-27 23:21:48,032 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_ROOT=E:\AI_System 2025-08-27 23:21:48,032 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_DIRECTORIES__PROJECT_ROOT=E:\AI_System 2025-08-27 23:21:48,032 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_DIRECTORIES__AGENT_DIR=E:\AI_System\agent 2025-08-27 23:21:48,032 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_DIRECTORIES__WEB_UI_DIR=E:\AI_System\web_ui 2025-08-27 23:21:48,032 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_DIRECTORIES__DEFAULT_MODEL=E:\AI_Models\Qwen2-7B 2025-08-27 23:21:48,032 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_ENVIRONMENT__LOG_LEVEL=DEBUG 2025-08-27 23:21:48,033 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_DATABASE__DB_HOST=localhost 2025-08-27 23:21:48,033 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_DATABASE__DB_PORT=5432 2025-08-27 23:21:48,033 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_DATABASE__DB_NAME=ai_system 2025-08-27 23:21:48,033 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_DATABASE__DB_USER=ai_user 2025-08-27 23:21:48,033 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_DATABASE__DB_PASSWORD=****** 2025-08-27 23:21:48,033 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_SECURITY__SECRET_KEY=****** 2025-08-27 23:21:48,033 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_MODEL_PATHS__TEXT_BASE=E:\AI_Models\Qwen2-7B 2025-08-27 23:21:48,033 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_MODEL_PATHS__TEXT_CHAT=E:\AI_Models\deepseek-7b-chat 2025-08-27 23:21:48,033 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_MODEL_PATHS__MULTIMODAL=E:\AI_Models\deepseek-vl2 2025-08-27 23:21:48,033 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_MODEL_PATHS__IMAGE_GEN=E:\AI_Models\sdxl 2025-08-27 23:21:48,033 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_MODEL_PATHS__YI_VL=E:\AI_Models\yi-vl 2025-08-27 23:21:48,033 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_MODEL_PATHS__STABLE_DIFFUSION=E:\AI_Models\stable-diffusion-xl-base-1.0 2025-08-27 23:21:48,033 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_NETWORK__HOST=0.0.0.0 2025-08-27 23:21:48,033 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_NETWORK__FLASK_PORT=8000 2025-08-27 23:21:48,033 - CoreConfig - INFO - 🔄 环境变量覆盖: AI_SYSTEM_NETWORK__GRADIO_PORT=7860 2025-08-27 23:21:48,034 - CoreConfig - WARNING - ⚠️ 模型路径不存在: STABLE_DIFFUSION = E:/AI_Models/stable-diffusion-xl-base-1.0 2025-08-27 23:21:48,034 - CoreConfig - INFO - ✅ 配置系统初始化完成 2025-08-27 23:21:48,416 - EnvironmentInterface - INFO - ✅ 初始化环境模块: EnvironmentInterface 2025-08-27 23:21:48,416 - EnvironmentInterface - INFO - ✅ 初始化环境模块: EnvironmentInterface Traceback (most recent call last): File "E:\AI_System\agent\environment_interface.py", line 198, in <module> env = EnvironmentInterface(config=config) File "E:\AI_System\agent\environment_interface.py", line 78, in __init__ self.workspace_root = self._resolve_workspace_path(self.base_dir) AttributeError: 'EnvironmentInterface' object has no attribute '_resolve_workspace_path' (venv) PS E:\AI_System> (venv) PS E:\AI_System> # 确认文件存在 (venv) PS E:\AI_System> dir agent\environment_interface.py Directory: E:\AI_System\agent Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2025/8/27 23:18 6972 environment_interface.py (venv) PS E:\AI_System> (venv) PS E:\AI_System> python --version Python 3.10.10 (venv) PS E:\AI_System> # 应该显示 Python 3.x (venv) PS E:\AI_System> # 检查虚拟环境中的包 (venv) PS E:\AI_System> pip list Package Version ------------------------- ------------ accelerate 0.27.2 aiofiles 23.2.1 aiohttp 3.9.3 aiosignal 1.4.0 altair 5.5.0 annotated-types 0.7.0 ansicon 1.89.0 anyio 4.10.0 async-timeout 4.0.3 attrs 25.3.0 bidict 0.23.1 blessed 1.21.0 blinker 1.9.0 Brotli 1.1.0 certifi 2025.8.3 cffi 1.17.1 charset-normalizer 3.4.3 click 8.2.1 colorama 0.4.6 coloredlogs 15.0.1 contourpy 1.3.2 cryptography 42.0.4 cycler 0.12.1 diffusers 0.26.3 diskcache 5.6.3 distro 1.9.0 exceptiongroup 1.3.0 fastapi 0.116.1 ffmpy 0.6.1 filelock 3.19.1 Flask 3.0.2 Flask-SocketIO 5.3.6 flatbuffers 25.2.10 fonttools 4.59.1 frozenlist 1.7.0 fsspec 2025.7.0 gpustat 1.1 gradio 4.19.2 gradio_client 0.10.1 groovy 0.1.2 h11 0.16.0 httpcore 1.0.9 httpx 0.28.1 huggingface-hub 0.21.3 humanfriendly 10.0 idna 3.10 importlib_metadata 8.7.0 importlib_resources 6.5.2 itsdangerous 2.2.0 Jinja2 3.1.6 jinxed 1.3.0 jsonschema 4.25.1 jsonschema-specifications 2025.4.1 kiwisolver 1.4.9 loguru 0.7.2 markdown-it-py 4.0.0 MarkupSafe 2.1.5 matplotlib 3.10.5 mdurl 0.1.2 mpmath 1.3.0 multidict 6.6.4 narwhals 2.1.2 networkx 3.4.2 numpy 1.26.3 nvidia-ml-py 13.580.65 onnxruntime 1.17.1 openai 1.13.3 orjson 3.11.2 packaging 25.0 pandas 2.1.4 pillow 10.4.0 pip 22.3.1 prettytable 3.16.0 propcache 0.3.2 protobuf 6.32.0 psutil 5.9.7 pycparser 2.22 pydantic 2.11.7 pydantic_core 2.33.2 pydub 0.25.1 Pygments 2.19.2 pyparsing 3.2.3 pyreadline3 3.5.4 python-dateutil 2.9.0.post0 python-dotenv 1.0.1 python-engineio 4.12.2 python-multipart 0.0.20 python-socketio 5.13.0 pytz 2025.2 pywin32 306 PyYAML 6.0.2 redis 5.0.3 referencing 0.36.2 regex 2025.7.34 requests 2.31.0 rich 14.1.0 rpds-py 0.27.0 ruff 0.12.10 safehttpx 0.1.6 safetensors 0.4.2 semantic-version 2.10.0 setuptools 65.5.0 shellingham 1.5.4 simple-websocket 1.1.0 six 1.17.0 sniffio 1.3.1 starlette 0.47.2 sympy 1.14.0 tomlkit 0.12.0 torch 2.1.2 torchaudio 2.5.1+cu118 torchvision 0.20.1+cu118 tqdm 4.67.1 transformers 4.37.0 typer 0.16.1 typing_extensions 4.14.1 typing-inspection 0.4.1 tzdata 2025.2 urllib3 2.5.0 uvicorn 0.35.0 waitress 2.1.2 wcwidth 0.2.13 websockets 11.0.3 Werkzeug 3.1.3 win32_setctime 1.2.0 wsproto 1.2.0 yarl 1.20.1 zipp 3.23.0 [notice] A new release of pip available: 22.3.1 -> 25.2 [notice] To update, run: python.exe -m pip install --upgrade pip (venv) PS E:\AI_System> # 应该包含 transformers, diskcache 等 (venv) PS E:\AI_System> # 进入Python交互模式 (venv) PS E:\AI_System> python Python 3.10.10 (tags/v3.10.10:aad5f6a, Feb 7 2023, 17:20:36) [MSC v.1929 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>>
最新发布
08-28
<think>我们遇到了一个错误:`AttributeError: 'EnvironmentInterface' object has no attribute '_resolve_workspace_path'` 这个错误表明在`EnvironmentInterface`类的`__init__`方法中,我们尝试调用`self._resolve_workspace_path`方法,但是这个方法不存在。 查看我们之前提供的代码,我们确实在`__init__`方法中有这样一行: self.workspace_root = self._resolve_workspace_path(self.base_dir) 所以,我们需要确保在`EnvironmentInterface`类中定义了`_resolve_workspace_path`方法。 让我们检查一下代码,发现我们之前为了节省空间,省略了部分方法。现在我们需要将这个方法补充完整。 以下是完整的`EnvironmentInterface`类,包括`_resolve_workspace_path`方法: ```python:agent/environment_interface.py import os import psutil import platform import json import sqlite3 import logging import time import sys import traceback from datetime import datetime from pathlib import Path import threading # 添加项目根目录到路径 sys.path.append(str(Path(__file__).parent.parent)) # 导入基类 try: from agent.base_module import EnvironmentModule except ImportError as e: logging.error(f"无法导入基类 EnvironmentModule: {e}") # 创建基类的占位符 class EnvironmentModule: def __init__(self, name): self.name = name self.logger = logging.getLogger(name) def get_input(self): return {} def output(self, response): print(response) class EnvironmentInterface(EnvironmentModule): """环境接口模块 - 完整版""" def __init__(self, name="EnvironmentInterface", coordinator=None, config=None): """初始化环境接口""" # 先处理配置参数 self.coordinator = coordinator self.config = config or {} self.base_dir = self.config.get("base_dir", ".") self.env_manager = self.config.get("env_manager") # 调用父类初始化 super().__init__(name) # 配置日志 self.logger = logging.getLogger(f'EnvironmentInterface') self._init_logger() # 状态管理 self._status = { "initialized": False, "running": True, "last_updated": time.time(), "errors": [], "warnings": [] } # 安全策略 self.authorized_actions = { "file_access": True, "web_search": True, "command_exec": True, "software_install": False, "hardware_control": False } self.action_log = [] self.input_queue = [] # 输入队列 self.last_interaction = time.time() # 工作区路径设置 self.workspace_root = self._resolve_workspace_path(self.base_dir) # 创建标准目录结构 self.models_dir = self._resolve_and_create_dir("01_模型存储") self.cache_dir = self._resolve_and_create_dir("01_模型存储/下载缓存") self.system_dir = self._resolve_and_create_dir("02_核心代码") self.temp_dir = self._resolve_and_create_dir("04_环境工具/临时补丁") self.python_dir = self._resolve_and_create_dir("04_环境工具/Python环境") # 环境配置 - 跨平台兼容 self._configure_path() # 初始化数据库 self.environment_db = os.path.join(self.system_dir, 'environment.db') self._init_db() # 启动监控线程 self._active = True self._monitor_thread = threading.Thread( target=self._monitor_loop, name="EnvMonitorThread", daemon=True ) self._monitor_thread.start() self.logger.info("✅ 环境接口初始化完成") def _init_logger(self): """初始化日志记录器""" 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) log_level = self.config.get("log_level", "INFO") self.logger.setLevel(getattr(logging, log_level.upper(), logging.INFO)) def _resolve_workspace_path(self, base_dir: str) -> str: """解析工作区根路径""" try: # 如果base_dir是绝对路径,直接使用 if os.path.isabs(base_dir): workspace_root = base_dir else: # 否则,相对于当前文件所在目录的父目录(项目根目录)解析 project_root = Path(__file__).parent.parent workspace_root = str(project_root / base_dir) # 确保路径存在 os.makedirs(workspace_root, exist_ok=True) return os.path.abspath(workspace_root) except Exception as e: self.logger.error(f"解析工作区路径失败: {str(e)}") # 使用当前工作目录作为后备 return os.path.abspath(os.getcwd()) def _resolve_and_create_dir(self, relative_path: str) -> str: """解析并创建目录,返回绝对路径""" full_path = os.path.join(self.workspace_root, relative_path) os.makedirs(full_path, exist_ok=True) return full_path # ... 其他方法保持不变 ... # 以下省略了其他方法,但实际代码中需要包含它们 # 测试代码 if __name__ == "__main__": # 配置根日志器 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) # 创建环境接口配置 config = { "base_dir": os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "log_level": "DEBUG", "monitor_interval": 5 } # 创建环境接口实例 env = EnvironmentInterface(config=config) # 初始化 env.initialize(None) print("\n===== 环境接口测试 =====") # ... 测试代码 ... ``` ### 关键修复点 1. **添加缺失的方法**: - `_resolve_workspace_path`:解析工作区根路径 - `_resolve_and_create_dir`:解析并创建目录 2. **路径解析逻辑**: - 如果`base_dir`是绝对路径,直接使用 - 否则,相对于当前文件所在目录的父目录(项目根目录)解析 - 确保路径存在(`os.makedirs`) ### 测试验证 再次运行测试命令: ```powershell (venv) PS E:\AI_System> python agent\environment_interface.py ``` ### 预期输出 ``` 2025-08-28 10:30:00,000 - EnvironmentInterface - INFO - ✅ 环境接口初始化完成 2025-08-28 10:30:00,001 - EnvironmentInterface - INFO - 环境路径配置完成 2025-08-28 10:30:00,002 - EnvironmentInterface - INFO - ✅ 数据库初始化完成: E:\AI_System\AI_Workspace\02_核心代码\environment.db 2025-08-28 10:30:00,003 - EnvironmentInterface - INFO - 系统监控线程启动 ===== 环境接口测试 ===== 工作区信息: { "workspace_root": "E:\\AI_System\\AI_Workspace", "models_dir": "E:\\AI_System\\AI_Workspace\\01_模型存储", ... } ... ``` ### 如果仍然遇到问题 1. **检查代码完整性**:确保所有方法都完整复制到文件中 2. **检查路径权限**:确保程序有权限在指定路径创建目录 3. **调试日志**:在`_resolve_workspace_path`方法中添加详细的日志输出 ### 附加调试建议 在`_resolve_workspace_path`方法中添加调试日志: ```python def _resolve_workspace_path(self, base_dir: str) -> str: """解析工作区根路径""" try: # 打印调试信息 self.logger.debug(f"解析工作区路径,base_dir: {base_dir}") # 如果base_dir是绝对路径,直接使用 if os.path.isabs(base_dir): workspace_root = base_dir self.logger.debug(f"使用绝对路径: {workspace_root}") else: # 否则,相对于当前文件所在目录的父目录(项目根目录)解析 project_root = Path(__file__).parent.parent workspace_root = str(project_root / base_dir) self.logger.debug(f"使用相对路径,项目根目录: {project_root},组合路径: {workspace_root}") # 确保路径存在 os.makedirs(workspace_root, exist_ok=True) abs_path = os.path.abspath(workspace_root) self.logger.debug(f"工作区绝对路径: {abs_path}") return abs_path except Exception as e: self.logger.error(f"解析工作区路径失败: {str(e)}") # 使用当前工作目录作为后备 fallback = os.path.abspath(os.getcwd()) self.logger.debug(f"使用后备路径: {fallback}") return fallback ``` ### 最终步骤 1. 将完整的`EnvironmentInterface`类代码复制到`agent/environment_interface.py`文件中 2. 运行测试命令 3. 观察输出,确保没有错误 §§相关问题§§: 1. Python中如何正确管理文件和目录路径? 2. 在类初始化过程中,如何处理依赖方法未定义的问题? 3. 如何设计跨平台兼容的路径管理模块? 4. 在大型项目中,如何有效组织和管理配置信息?</think>根据错误日志和您提供的上下文,问题在于 `EnvironmentInterface` 类中缺少 `_resolve_workspace_path` 方法。让我们修复这个问题并提供完整的解决方案。 ### 问题分析 错误信息:`AttributeError: 'EnvironmentInterface' object has no attribute '_resolve_workspace_path'` - 原因:在 `__init__` 方法中调用了 `self._resolve_workspace_path()`,但该方法未定义 - 解决:需要添加缺失的方法实现 ### 完整修复方案 ```python:agent/environment_interface.py import os import psutil import platform import json import sqlite3 import logging import time import sys import traceback from datetime import datetime from pathlib import Path import threading # 添加项目根目录到路径 sys.path.append(str(Path(__file__).parent.parent)) # 导入基类 try: from agent.base_module import EnvironmentModule except ImportError as e: logging.error(f"无法导入基类 EnvironmentModule: {e}") # 创建基类的占位符 class EnvironmentModule: def __init__(self, name): self.name = name self.logger = logging.getLogger(name) def get_input(self): return {} def output(self, response): print(response) class EnvironmentInterface(EnvironmentModule): """环境接口模块 - 修复版""" def __init__(self, name="EnvironmentInterface", coordinator=None, config=None): """初始化环境接口 - 修复缺失方法问题""" # 先处理配置参数 self.coordinator = coordinator self.config = config or {} self.base_dir = self.config.get("base_dir", ".") self.env_manager = self.config.get("env_manager") # 调用父类初始化 super().__init__(name) # 配置日志 self.logger = logging.getLogger(f'EnvironmentInterface') self._init_logger() # 状态管理 self._status = { "initialized": False, "running": True, "last_updated": time.time(), "errors": [], "warnings": [] } # 安全策略 self.authorized_actions = { "file_access": True, "web_search": True, "command_exec": True, "software_install": False, "hardware_control": False } self.action_log = [] self.input_queue = [] # 输入队列 self.last_interaction = time.time() # 工作区路径设置 self.workspace_root = self._resolve_workspace_path(self.base_dir) # 创建标准目录结构 self.models_dir = self._resolve_and_create_dir("01_模型存储") self.cache_dir = self._resolve_and_create_dir("01_模型存储/下载缓存") self.system_dir = self._resolve_and_create_dir("02_核心代码") self.temp_dir = self._resolve_and_create_dir("04_环境工具/临时补丁") self.python_dir = self._resolve_and_create_dir("04_环境工具/Python环境") # 环境配置 - 跨平台兼容 self._configure_path() # 初始化数据库 self.environment_db = os.path.join(self.system_dir, 'environment.db') self._init_db() # 启动监控线程 self._active = True self._monitor_thread = threading.Thread( target=self._monitor_loop, name="EnvMonitorThread", daemon=True ) self._monitor_thread.start() self.logger.info("✅ 环境接口初始化完成") def _init_logger(self): """初始化日志记录器""" 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) log_level = self.config.get("log_level", "INFO") self.logger.setLevel(getattr(logging, log_level.upper(), logging.INFO)) # ===== 添加缺失的方法 ===== def _resolve_workspace_path(self, base_dir: str) -> str: """解析工作区根路径""" try: # 如果base_dir是绝对路径,直接使用 if os.path.isabs(base_dir): workspace_root = base_dir else: # 否则,相对于当前文件所在目录的父目录(项目根目录)解析 project_root = Path(__file__).parent.parent workspace_root = str(project_root / base_dir) # 确保路径存在 os.makedirs(workspace_root, exist_ok=True) return os.path.abspath(workspace_root) except Exception as e: self.logger.error(f"解析工作区路径失败: {str(e)}") # 使用当前工作目录作为后备 return os.path.abspath(os.getcwd()) def _resolve_and_create_dir(self, relative_path: str) -> str: """解析并创建目录,返回绝对路径""" full_path = os.path.join(self.workspace_root, relative_path) os.makedirs(full_path, exist_ok=True) return full_path def _configure_path(self): """配置环境路径""" try: path_sep = os.pathsep os.environ['PATH'] = f"{self.python_dir}{path_sep}{os.environ['PATH']}" if platform.system() == "Windows": os.environ['PATH'] += f"{path_sep}{self.python_dir}\\Scripts" os.environ['HF_HOME'] = self.cache_dir self.logger.info("环境路径配置完成") except Exception as e: self.logger.error(f"配置环境路径失败: {str(e)}") self._status["errors"].append(f"PATH配置失败: {str(e)}") def _init_db(self): """初始化数据库""" try: with sqlite3.connect(self.environment_db) as conn: cursor = conn.cursor() # 创建资源表 cursor.execute(''' CREATE TABLE IF NOT EXISTS resources ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, type TEXT NOT NULL, path TEXT NOT NULL, is_active BOOLEAN DEFAULT 0, last_used TIMESTAMP ) ''') # 创建VIP资源表 cursor.execute(''' CREATE TABLE IF NOT EXISTS vip_resources ( id INTEGER PRIMARY KEY, name TEXT NOT NULL UNIQUE, type TEXT NOT NULL, is_available BOOLEAN DEFAULT 1, locked_by TEXT, lock_time TIMESTAMP ) ''') conn.commit() self.logger.info(f"✅ 数据库初始化完成: {self.environment_db}") except Exception as e: self.logger.error(f"数据库初始化失败: {str(e)}") self._status["errors"].append(f"数据库错误: {str(e)}") def _monitor_loop(self): """监控系统状态的后台线程""" self.logger.info("系统监控线程启动") while self._active: try: # 检查系统资源使用情况 cpu_percent = psutil.cpu_percent(interval=1) mem_usage = psutil.virtual_memory().percent disk_usage = psutil.disk_usage(self.workspace_root).percent # 记录到状态 self._status["cpu_usage"] = cpu_percent self._status["memory_usage"] = mem_usage self._status["disk_usage"] = disk_usage self._status["last_updated"] = time.time() # 检查空闲时间 idle_time = time.time() - self.last_interaction if idle_time > 300: # 5分钟无交互 self.logger.warning(f"系统空闲超过5分钟,当前空闲时间: {idle_time:.1f}秒") # 休眠直到下次检查 time.sleep(self.config.get("monitor_interval", 10)) except Exception as e: self.logger.error(f"监控线程异常: {str(e)}") time.sleep(10) # 出错后等待10秒再试 # ===== 实现基类接口 ===== def get_input(self): """获取输入 - 实现基类接口""" if not self.input_queue: self._generate_sample_inputs() if self.input_queue: return self.input_queue.pop(0) # 默认返回空输入 return {"content": {"text": ""}, "source": "system"} def _generate_sample_inputs(self): """生成示例输入 - 用于测试""" sample_inputs = [ {"content": {"text": "Hello, how are you?"}, "source": "user"}, {"content": {"text": "What is your name?"}, "source": "user"}, {"content": {"text": "Tell me about yourself."}, "source": "user"}, {"content": {"text": "I am feeling great today."}, "source": "user"}, {"content": {"text": "My name is Alex."}, "source": "user"}, ] self.input_queue.extend(sample_inputs) def output(self, response): """输出响应 - 实现基类接口""" self.logger.info(f"💬 系统响应: {response}") # 实际系统中应添加发送到前端或存储的逻辑 print(f">> {response}") def add_input(self, input_data: dict): """添加新输入到队列""" self.input_queue.append(input_data) self.last_interaction = time.time() self.logger.info(f"📥 收到新输入: {input_data}") # ===== 环境接口功能方法 ===== def initialize(self, core): """初始化模块并连接到核心系统""" if self._status["initialized"]: self.logger.warning("系统已经初始化过") return True self.core_ref = core self._status["initialized"] = True self._status["last_updated"] = time.time() self.logger.info("✅ 环境接口连接到核心系统") return True def get_workspace_info(self): """获取工作区信息""" return { "workspace_root": self.workspace_root, "models_dir": self.models_dir, "cache_dir": self.cache_dir, "system_dir": self.system_dir, "temp_dir": self.temp_dir, "python_dir": self.python_dir } def get_system_info(self): """获取系统信息""" return { "os": f"{platform.system()} {platform.release()}", "cpu": f"{psutil.cpu_count(logical=False)} cores, {psutil.cpu_count()} threads", "memory": f"{psutil.virtual_memory().total / (1024**3):.2f} GB", "disk": f"{psutil.disk_usage(self.workspace_root).total / (1024**3):.2f} GB", "python_version": platform.python_version() } def explore_directory(self, path=None): """探索目录内容""" target_path = path or self.workspace_root try: contents = [] for entry in os.listdir(target_path): entry_path = os.path.join(target_path, entry) is_dir = os.path.isdir(entry_path) size = os.path.getsize(entry_path) if not is_dir else 0 contents.append({ "name": entry, "type": "directory" if is_dir else "file", "size": size, "modified": datetime.fromtimestamp(os.path.getmtime(entry_path)).isoformat() }) return { "path": target_path, "contents": contents } except Exception as e: return {"error": str(e)} def request_vip_access(self, agent_id, resource_type): """请求VIP资源访问""" # 实际实现应包括资源锁定和超时处理 self.logger.info(f"Agent {agent_id} 请求访问 {resource_type} 资源") return True def release_vip_resource(self, agent_id, resource_type): """释放VIP资源""" self.logger.info(f"Agent {agent_id} 释放 {resource_type} 资源") def get_vip_status(self): """获取VIP资源状态""" # 实际实现应从数据库读取状态 return { "GPU": {"available": True, "locked_by": None}, "HighMemory": {"available": True, "locked_by": None} } def get_resources(self): """获取所有资源列表""" resources = [] try: with sqlite3.connect(self.environment_db) as conn: cursor = conn.cursor() cursor.execute("SELECT id, name, type, path, is_active FROM resources") for row in cursor.fetchall(): resources.append({ "id": row[0], "name": row[1], "type": row[2], "path": row[3], "is_active": bool(row[4]) }) except Exception as e: self.logger.error(f"获取资源失败: {str(e)}") return resources def activate_resource(self, resource_id): """激活资源""" try: with sqlite3.connect(self.environment_db) as conn: cursor = conn.cursor() # 先停用所有同类型资源 cursor.execute("UPDATE resources SET is_active = 0 WHERE type IN (SELECT type FROM resources WHERE id = ?)", (resource_id,)) # 激活指定资源 cursor.execute("UPDATE resources SET is_active = 1 WHERE id = ?", (resource_id,)) conn.commit() return True except Exception as e: self.logger.error(f"激活资源失败: {str(e)}") return False def get_status(self): """获取系统状态""" return self._status def is_healthy(self): """检查系统健康状况""" errors = self._status.get("errors", []) if errors: return False, f"发现 {len(errors)} 个错误" return True, "系统运行正常" def shutdown(self): """关闭系统""" self.logger.info("🛑 关闭环境接口...") self._active = False self._monitor_thread.join(timeout=5) self.logger.info("✅ 环境接口已关闭") # 使用示例 if __name__ == "__main__": # 配置根日志器 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) # 创建环境接口配置 config = { "base_dir": os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "log_level": "DEBUG", "monitor_interval": 5 } # 创建环境接口实例 env = EnvironmentInterface(config=config) # 初始化 env.initialize(None) print("\n===== 环境接口测试 =====") # 测试工作区信息 print("\n工作区信息:") print(json.dumps(env.get_workspace_info(), indent=2, ensure_ascii=False)) # 测试系统信息 print("\n系统信息:") print(json.dumps(env.get_system_info(), indent=2, ensure_ascii=False)) # 测试探索目录 print("\n工作区内容:") print(json.dumps(env.explore_directory(), indent=2, ensure_ascii=False)) # 测试VIP系统 print("\nVIP系统测试:") print("请求访问权限:", env.request_vip_access("agent-001", "GPU")) print("VIP状态:", json.dumps(env.get_vip_status(), indent=2)) env.release_vip_resource("agent-001", "GPU") print("释放后VIP状态:", json.dumps(env.get_vip_status(), indent=2)) # 测试资源管理 print("\n资源管理测试:") # 添加测试资源 with sqlite3.connect(env.environment_db) as conn: cursor = conn.cursor() cursor.execute("INSERT INTO resources (name, type, path) VALUES (?, ?, ?)", ("Theme-Dark", "skin", "/themes/dark")) cursor.execute("INSERT INTO resources (name, type, path) VALUES (?, ?, ?)", ("Toolkit-AI", "tool", "/tools/ai_toolkit")) conn.commit() print("当前资源:", json.dumps(env.get_resources(), indent=2)) # 激活资源 print("\n激活资源:") print("激活结果:", env.activate_resource(1)) print("激活后资源状态:", json.dumps(env.get_resources(), indent=2)) # 获取状态 print("\n系统状态:") status = env.get_status() print(json.dumps(status, indent=2, default=str)) # 健康检查 healthy, reason = env.is_healthy() print(f"\n健康状态: {'健康' if healthy else '异常'} - {reason}") # 关闭系统 print("\n关闭系统...") env.shutdown() print("✅ 测试完成") ``` ### 关键修复点 1. **添加缺失的方法**: - `_resolve_workspace_path`:解析工作区根路径 - `_resolve_and_create_dir`:解析并创建目录 - `_configure_path`:配置环境路径 - `_init_db`:初始化数据库 - `_monitor_loop`:监控系统状态的后台线程 2. **增强错误处理**: - 所有关键操作都添加了异常处理 - 错误信息会记录到状态中 - 提供后备方案(如使用当前工作目录) 3. **完整功能实现**: - 工作区管理 - 资源管理 - VIP资源控制 - 系统状态监控 ### 测试验证步骤 1. 将完整代码保存到 `agent/environment_interface.py` 2. 运行测试命令: ```powershell (venv) PS E:\AI_System> python agent\environment_interface.py ``` ### 预期输出 ``` 2025-08-28 11:00:00,000 - EnvironmentInterface - INFO - ✅ 环境接口初始化完成 2025-08-28 11:00:00,001 - EnvironmentInterface - INFO - 环境路径配置完成 2025-08-28 11:00:00,002 - EnvironmentInterface - INFO - ✅ 数据库初始化完成: E:\AI_System\AI_Workspace\02_核心代码\environment.db 2025-08-28 11:00:00,003 - EnvironmentInterface - INFO - 系统监控线程启动 ===== 环境接口测试 ===== 工作区信息: { "workspace_root": "E:\\AI_System\\AI_Workspace", "models_dir": "E:\\AI_System\\AI_Workspace\\01_模型存储", ... } 系统信息: { "os": "Windows 10", "cpu": "Intel i7-10700K (8 cores)", ... } ...其他测试输出... ``` ### 后续步骤 1. **修复主程序**:确保 `main.py` 中正确初始化环境接口 ```python:main.py # 在 main.py 中添加 from agent.environment_interface import EnvironmentInterface # 初始化环境接口 environment = EnvironmentInterface(config={ "base_dir": config.get("DIRECTORIES", {}).get("PROJECT_ROOT", "."), "log_level": config.get("ENVIRONMENT", {}).get("LOG_LEVEL", "INFO") }) ``` 2. **运行主程序**: ```powershell (venv) PS E:\AI_System> python main.py ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值