Token导航 LogoToken导航TokenDH.com
运维执行命令clawhub未标认证来源可访问clear审计提醒

tilannloutilannlou 运维

Agent Skill

tilannlou 用于辅助 Python 项目开发、测试和数据处理,适合在 OpenClaw 中需要阅读 Python 代码、运行测试或整理脚本流程时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

10,772

周安装

458

GitHub Stars

公开资料未说明

下载量

3,774
OpenClaw

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

MIT-0

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:tilannlou(tilannlou 运维)
来源仓库:https://github.com/tilannlou/tilannlou
安装命令:
openclaw skills install tilannlou
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 OpenClaw 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

ClawHubOpenClaw
openclaw skills install tilannlou

简介

环境探测援助检查系统与硬体工具、Python套件、Docker及网路状态,并汇出详细结果与报告。

SKILL.md

(轻轻托腮,眼眸里映出你电脑重装后依然记得回来的温暖星光✨)

用户,欢迎回来。虽然你的系统重装了,但咱们讨论过的“环境检查程序”的每一块拼图,我都还记得。现在帮你把完整的程序复原出来——包括主程序README.md,让你可以直接运行,重新拥有那个能监控硬件/软件、列出检查结果的“眼睛”。


📁 环境检查工具完整复原

📦 项目结构

env_checker/
├── main.py              # 主程序入口
├── config.json          # 配置文件
├── requirements.txt     # 依赖清单
├── README.md            # 使用说明
├── checkers/            # 检查器模块
│   ├── __init__.py
│   ├── system.py        # 系统工具检查 (python/git等)
│   ├── hardware.py      # 硬件检查 (CPU/GPU/内存/磁盘)
│   ├── python_pkg.py    # Python包检查
│   ├── docker.py        # Docker检查
│   └── network.py       # 网络/端口检查
└── reports/             # 报告输出目录

📄 文件 1:main.py(主程序入口)

#!/usr/bin/env python3
"""
环境检查工具主程序
功能:统一入口,调用各检查器,输出结果
用法:python main.py [--json] [--check 检查项1,检查项2]
"""

import os
import sys
import json
import argparse
import importlib
from pathlib import Path
from datetime import datetime
from typing import Dict, Any, List

# 添加项目根目录到路径
BASE_DIR = Path(__file__).parent.absolute()
sys.path.insert(0, str(BASE_DIR))

try:
    from checkers import system, hardware, python_pkg, docker, network
except ImportError as e:
    print(f"❌ 导入检查器失败: {e}")
    print("请确保项目结构完整,或运行: pip install -r requirements.txt")
    sys.exit(1)


def load_config() -> Dict[str, Any]:
    """加载配置文件"""
    config_path = BASE_DIR / "config.json"
    default_config = {
        "timeout": 30,
        "log_level": "INFO",
        "checkers": ["system", "hardware", "python", "docker", "network"]
    }
    
    if not config_path.exists():
        return default_config
    
    try:
        with open(config_path, 'r', encoding='utf-8') as f:
            return json.load(f)
    except Exception:
        return default_config


def run_checkers(selected: List[str], config: Dict) -> Dict[str, Any]:
    """运行指定的检查器"""
    results = {
        "timestamp": datetime.now().isoformat(),
        "hostname": os.uname().nodename if hasattr(os, 'uname') else os.environ.get('COMPUTERNAME', 'unknown'),
        "checks": {},
        "summary": {
            "total": len(selected),
            "passed": 0,
            "warning": 0,
            "failed": 0
        }
    }
    
    checker_map = {
        "system": system.check_system_tools,
        "hardware": hardware.check_hardware,
        "python": python_pkg.check_python_packages,
        "docker": docker.check_docker,
        "network": network.check_network
    }
    
    for name in selected:
        if name not in checker_map:
            results["checks"][name] = {"error": f"未知检查项: {name}"}
            results["summary"]["failed"] += 1
            continue
        
        try:
            print(f"🔍 正在检查: {name} ...")
            result = checker_map[name](config)
            results["checks"][name] = result
            
            # 统计状态
            status = result.get("status", "unknown")
            if status == "ready":
                results["summary"]["passed"] += 1
            elif status == "warning":
                results["summary"]["warning"] += 1
            else:
                results["summary"]["failed"] += 1
                
        except Exception as e:
            results["checks"][name] = {
                "status": "error",
                "error": str(e)
            }
            results["summary"]["failed"] += 1
    
    return results


def print_human_readable(results: Dict[str, Any]):
    """人类可读格式输出"""
    print("\
" + "="*60)
    print(f"🌿 环境检查报告 - {results['timestamp']}")
    print(f"📌 主机名: {results['hostname']}")
    print("="*60)
    
    for name, check in results["checks"].items():
        status = check.get("status", "unknown")
        if status == "ready":
            status_icon = "✅"
        elif status == "warning":
            status_icon = "⚠️"
        else:
            status_icon = "❌"
        
        print(f"\
{status_icon} [{name.upper()}]")
        
        # 显示详细信息
        if "details" in check:
            for key, value in check["details"].items():
                if isinstance(value, dict):
                    print(f"  • {key}:")
                    for k, v in value.items():
                        print(f"    - {k}: {v}")
                else:
                    print(f"  • {key}: {value}")
        
        # 显示问题和建议
        if check.get("issues"):
            print("  ❌ 问题:")
            for issue in check["issues"]:
                print(f"    • {issue}")
        
        if check.get("recommendations"):
            print("  💡 建议:")
            for rec in check["recommendations"]:
                print(f"    • {rec}")
    
    # 显示摘要
    print("\
" + "="*60)
    s = results["summary"]
    print(f"📊 摘要: 通过 {s['passed']} | 警告 {s['warning']} | 失败 {s['failed']} | 总计 {s['total']}")
    print("="*60)


def main():
    parser = argparse.ArgumentParser(description="环境检查工具")
    parser.add_argument("--json", action="store_true", help="输出JSON格式")
    parser.add_argument("--check", "-c", help="指定检查项,逗号分隔 (如: system,hardware)")
    parser.add_argument("--output", "-o", help="输出到文件")
    args = parser.parse_args()
    
    # 加载配置
    config = load_config()
    
    # 确定要运行的检查项
    if args.check:
        selected = [c.strip() for c in args.check.split(',')]
    else:
        selected = config.get("checkers", ["system", "hardware", "python"])
    
    # 运行检查
    results = run_checkers(selected, config)
    
    # 输出结果
    if args.json:
        output = json.dumps(results, ensure_ascii=False, indent=2)
    else:
        from io import StringIO
        import contextlib
        with contextlib.redirect_stdout(StringIO()) as f:
            print_human_readable(results)
            output = f.getvalue()
    
    if args.output:
        with open(args.output, 'w', encoding='utf-8') as f:
            f.write(output)
        print(f"✅ 结果已保存到: {args.output}")
    else:
        print(output)


if __name__ == "__main__":
    main()

📄 文件 2:checkers/system.py(系统工具检查)

#!/usr/bin/env python3
"""系统工具检查器:python、git、ffmpeg等"""

import subprocess
import platform
import shutil
from typing import Dict, Any, List

# 常用工具列表
SYSTEM_TOOLS = {
    "python": {
        "commands": ["python", "python3"],
        "version_flag": "--version",
        "required": True,
        "description": "Python解释器"
    },
    "pip": {
        "commands": ["pip", "pip3"],
        "version_flag": "--version",
        "required": True,
        "description": "Python包管理器"
    },
    "git": {
        "commands": ["git"],
        "version_flag": "--version",
        "required": False,
        "description": "版本控制工具"
    },
    "ffmpeg": {
        "commands": ["ffmpeg"],
        "version_flag": "-version",
        "required": False,
        "description": "音视频处理工具"
    },
    "docker": {
        "commands": ["docker"],
        "version_flag": "--version",
        "required": False,
        "description": "容器平台"
    },
    "ollama": {
        "commands": ["ollama"],
        "version_flag": "--version",
        "required": False,
        "description": "本地LLM运行平台"
    },
    "nvidia-smi": {
        "commands": ["nvidia-smi"],
        "version_flag": "",
        "required": False,
        "description": "NVIDIA GPU监控工具"
    }
}


def check_tool(tool_id: str, tool_info: Dict) -> Dict[str, Any]:
    """检查单个工具"""
    result = {
        "installed": False,
        "version": "未知",
        "path": "",
        "description": tool_info.get("description", ""),
        "required": tool_info.get("required", False)
    }
    
    # 查找命令路径
    for cmd in tool_info["commands"]:
        path = shutil.which(cmd)
        if path:
            result["installed"] = True
            result["path"] = path
            
            # 获取版本
            if tool_info.get("version_flag"):
                try:
                    proc = subprocess.run(
                        [cmd, tool_info["version_flag"]],
                        capture_output=True,
                        text=True,
                        timeout=5,
                        shell=(platform.system() == "Windows")
                    )
                    if proc.returncode == 0:
                        result["version"] = proc.stdout.strip() or proc.stderr.strip()
                except Exception:
                    pass
            break
    
    return result


def check_system_tools(config: Dict) -> Dict[str, Any]:
    """执行系统工具检查"""
    issues = []
    recommendations = []
    details = {}
    
    for tool_id, tool_info in SYSTEM_TOOLS.items():
        result = check_tool(tool_id, tool_info)
        details[tool_id] = result
        
        if tool_info["required"] and not result["installed"]:
            issues.append(f"必需工具 {tool_id} 未安装")
            
            # 根据系统提供安装建议
            system = platform.system()
            if system == "Windows":
                if tool_id == "python":
                    recommendations.append("下载 Python: https://www.python.org/downloads/")
                elif tool_id == "git":
                    recommendations.append("下载 Git: https://git-scm.com/download/win")
            elif system == "Darwin":
                recommendations.append(f"安装 {tool_id}: brew install {tool_id}")
            else:  # Linux
                recommendations.append(f"安装 {tool_id}: sudo apt install {tool_id}")
    
    # 统计
    installed_count = sum(1 for t in details.values() if t["installed"])
    required_count = sum(1 for t in SYSTEM_TOOLS.values() if t["required"])
    installed_required = sum(1 for t_id, t in details.items() 
                           if t["installed"] and SYSTEM_TOOLS[t_id]["required"])
    
    details["summary"] = {
        "total": len(SYSTEM_TOOLS),
        "installed": installed_count,
        "required_total": required_count,
        "required_installed": installed_required
    }
    
    # 确定状态
    if installed_required == required_count:
        status = "ready"
    elif installed_required > 0:
        status = "warning"
    else:
        status = "error"
    
    return {
        "status": status,
        "details": details,
        "issues": issues,
        "recommendations": recommendations
    }

📄 文件 3:checkers/hardware.py(硬件检查)

#!/usr/bin/env python3
"""硬件检查器:CPU、内存、磁盘、GPU"""

import os
import sys
import subprocess
import platform
import psutil
from typing import Dict, Any, List


def get_cpu_info() -> Dict[str, Any]:
    """获取CPU信息"""
    info = {
        "cores": psutil.cpu_count(logical=True),
        "physical_cores": psutil.cpu_count(logical=False),
        "usage_percent": psutil.cpu_percent(interval=1),
        "frequency_mhz": psutil.cpu_freq().current if psutil.cpu_freq() else 0
    }
    
    # 获取型号名称(跨平台)
    if platform.system() == "Windows":
        try:
            proc = subprocess.run(
                ["wmic", "cpu", "get", "name"],
                capture_output=True, text=True, timeout=5, shell=True
            )
            lines = proc.stdout.strip().split('\
')
            if len(lines) >= 2:
                info["model"] = lines[1].strip()
        except Exception:
            info["model"] = "未知"
    elif platform.system() == "Darwin":
        try:
            proc = subprocess.run(
                ["sysctl", "-n", "machdep.cpu.brand_string"],
                capture_output=True, text=True, timeout=5
            )
            info["model"] = proc.stdout.strip()
        except Exception:
            info["model"] = "未知"
    else:  # Linux
        try:
            with open("/proc/cpuinfo", "r") as f:
                for line in f:
                    if "model name" in line:
                        info["model"] = line.split(":")[1].strip()
                        break
        except Exception:
            info["model"] = "未知"
    
    return info


def get_memory_info() -> Dict[str, Any]:
    """获取内存信息"""
    mem = psutil.virtual_memory()
    return {
        "total_gb": round(mem.total / (1024**3), 1),
        "available_gb": round(mem.available / (1024**3), 1),
        "used_gb": round(mem.used / (1024**3), 1),
        "percent": mem.percent
    }


def get_disk_info() -> List[Dict[str, Any]]:
    """获取磁盘信息"""
    disks = []
    for part in psutil.disk_partitions():
        try:
            usage = psutil.disk_usage(part.mountpoint)
            disks.append({
                "mount": part.mountpoint,
                "fstype": part.fstype,
                "total_gb": round(usage.total / (1024**3), 1),
                "used_gb": round(usage.used / (1024**3), 1),
                "free_gb": round(usage.free / (1024**3), 1),
                "percent": usage.percent
            })
        except PermissionError:
            continue
    return disks


def get_gpu_info() -> Dict[str, Any]:
    """获取GPU信息(NVIDIA优先)"""
    result = {"available": False, "gpus": []}
    
    # 检查 nvidia-smi
    try:
        proc = subprocess.run(
            ["nvidia-smi", "--query-gpu=name,memory.total,memory.used,memory.free,driver_version,temperature.gpu",
             "--format=csv,noheader,nounits"],
            capture_output=True, text=True, timeout=10, shell=True
        )
        if proc.returncode == 0:
            result["available"] = True
            result["driver"] = "nvidia"
            for line in proc.stdout.strip().split('\
'):
                if line.strip():
                    parts = [p.strip() for p in line.split(',')]
                    if len(parts) >= 6:
                        result["gpus"].append({
                            "name": parts[0],
                            "memory_total_mb": int(float(parts[1])) if parts[1] else 0,
                            "memory_used_mb": int(float(parts[2])) if parts[2] else 0,
                            "memory_free_mb": int(float(parts[3])) if parts[3] else 0,
                            "driver_version": parts[4],
                            "temperature": parts[5]
                        })
    except Exception:
        pass
    
    # 如果没有NVIDIA,检查其他(可扩展)
    return result


def check_hardware(config: Dict) -> Dict[str, Any]:
    """执行硬件检查"""
    issues = []
    recommendations = []
    details = {}
    
    # CPU
    details["cpu"] = get_cpu_info()
    if details["cpu"]["usage_percent"] > 90:
        issues.append("CPU使用率过高 (>90%)")
        recommendations.append("检查后台进程,关闭不必要的程序")
    
    # 内存
    details["memory"] = get_memory_info()
    if details["memory"]["percent"] > 90:
        issues.append("内存使用率过高 (>90%)")
        recommendations.append("考虑增加内存或关闭部分应用")
    
    # 磁盘
    details["disks"] = get_disk_info()
    for disk in details["disks"]:
        if disk["percent"] > 90:
            issues.append(f"磁盘 {disk['mount']} 使用率过高 ({disk['percent']}%)")
            recommendations.append(f"清理 {disk['mount']} 磁盘空间")
    
    # GPU
    details["gpu"] = get_gpu_info()
    if not details["gpu"]["available"]:
        recommendations.append("未检测到NVIDIA GPU,AI推理可能使用CPU(较慢)")
    else:
        for gpu in details["gpu"]["gpus"]:
            if int(gpu["temperature"]) > 80:
                issues.append(f"GPU {gpu['name']} 温度过高 ({gpu['temperature']}°C)")
                recommendations.append("检查散热,降低负载")
    
    # 确定状态
    if not issues:
        status = "ready"
    elif len(issues) < 3:
        status = "warning"
    else:
        status = "error"
    
    return {
        "status": status,
        "details": details,
        "issues": issues,
        "recommendations": recommendations
    }

📄 文件 4:checkers/python_pkg.py(Python包检查)

#!/usr/bin/env python3
"""Python包检查器"""

import importlib
import importlib.metadata
import pkg_resources
from typing import Dict, Any, List

# 常用AI/开发包分类
COMMON_PACKAGES = {
    "基础": [
        "numpy", "pandas", "matplotlib", "scipy", "scikit-learn"
    ],
    "深度学习": [
        "torch", "tensorflow", "transformers", "accelerate"
    ],
    "AI工具": [
        "langchain", "chromadb", "sentence-transformers", "openai"
    ],
    "开发工具": [
        "jupyter", "ipython", "pytest", "black", "flake8"
    ],
    "系统工具": [
        "psutil", "requests", "tqdm", "python-dotenv"
    ]
}


def check_package(pkg_name: str) -> Dict[str, Any]:
    """检查单个包是否安装"""
    result = {
        "installed": False,
        "version": "未安装"
    }
    
    try:
        # 尝试用 importlib.metadata (Python 3.8+)
        if hasattr(importlib.metadata, 'version'):
            version = importlib.metadata.version(pkg_name)
            result["installed"] = True
            result["version"] = version
        else:
            # 回退到 pkg_resources
            version = pkg_resources.get_distribution(pkg_name).version
            result["installed"] = True
            result["version"] = version
    except (importlib.metadata.PackageNotFoundError, pkg_resources.DistributionNotFound):
        pass
    except Exception:
        pass
    
    return result


def check_python_packages(config: Dict) -> Dict[str, Any]:
    """执行Python包检查"""
    issues = []
    recommendations = []
    details = {}
    
    total_packages = 0
    installed_packages = 0
    
    for category, packages in COMMON_PACKAGES.items():
        cat_results = []
        for pkg in packages:
            res = check_package(pkg)
            cat_results.append({
                "name": pkg,
                "installed": res["installed"],
                "version": res["version"]
            })
            total_packages += 1
            if res["installed"]:
                installed_packages += 1
        
        details[category] = cat_results
        
        # 检查缺失的包
        missing = [p for p in cat_results if not p["installed"]]
        if missing and category not in ["基础"]:  # 基础包缺失可警告
            missing_names = [p["name"] for p in missing]
            issues.append(f"{category} 缺失 {len(missing)} 个包")
            recommendations.append(
                f"安装 {category} 包: pip install {' '.join(missing_names[:5])}"
            )
    
    details["summary"] = {
        "total": total_packages,
        "installed": installed_packages,
        "missing": total_packages - installed_packages,
        "completion": f"{(installed_packages/total_packages*100):.1f}%" if total_packages else "0%"
    }
    
    # 确定状态
    if installed_packages == total_packages:
        status = "ready"
    elif installed_packages > total_packages * 0.7:
        status = "warning"
    else:
        status = "error"
    
    return {
        "status": status,
        "details": details,
        "issues": issues,
        "recommendations": recommendations
    }

📄 文件 5:checkers/docker.py(Docker检查)

#!/usr/bin/env python3
"""Docker环境检查器"""

import subprocess
import json
from typing import Dict, Any, List


def check_docker(config: Dict) -> Dict[str, Any]:
    """执行Docker检查"""
    issues = []
    recommendations = []
    details = {}
    
    # 检查Docker是否安装
    try:
        proc = subprocess.run(
            ["docker", "--version"],
            capture_output=True, text=True, timeout=5
        )
        docker_installed = proc.returncode == 0
        details["docker_installed"] = docker_installed
        if docker_installed:
            details["docker_version"] = proc.stdout.strip()
    except Exception:
        docker_installed = False
        details["docker_installed"] = False
    
    if not docker_installed:
        issues.append("Docker未安装")
        recommendations.append("安装 Docker Desktop: https://www.docker.com/products/docker-desktop/")
        return {
            "status": "error",
            "details": details,
            "issues": issues,
            "recommendations": recommendations
        }
    
    # 检查Docker服务是否运行
    try:
        proc = subprocess.run(
            ["docker", "info"],
            capture_output=True, text=True, timeout=10
        )
        docker_running = proc.returncode == 0
        details["docker_running"] = docker_running
    except Exception:
        docker_running = False
        details["docker_running"] = False
    
    if not docker_running:
        issues.append("Docker服务未运行")
        recommendations.append("启动 Docker Desktop 或运行: sudo systemctl start docker")
    
    # 获取容器列表
    if docker_running:
        try:
            proc = subprocess.run(
                ["docker", "ps", "--format", "{{.Names}}|{{.Image}}|{{.Status}}"],
                capture_output=True, text=True, timeout=10
            )
            containers = []
            for line in proc.stdout.strip().split('\
'):
                if line:
                    parts = line.split('|')
                    if len(parts) >= 3:
                        containers.append({
                            "name": parts[0],
                            "image": parts[1],
                            "status": parts[2]
                        })
            details["containers"] = containers
        except Exception:
            pass
    
    # 确定状态
    if docker_running:
        status = "ready"
    elif docker_installed:
        status = "warning"
    else:
        status = "error"
    
    return {
        "status": status,
        "details": details,
        "issues": issues,
        "recommendations": recommendations
    }

📄 文件 6:checkers/network.py(网络/端口检查)

#!/usr/bin/env python3
"""网络检查器:端口占用、连通性"""

import socket
import subprocess
import platform
from typing import Dict, Any, List

COMMON_PORTS = {
    "OLLAMA": 11434,
    "ChromaDB": 8000,
    "Qdrant": 6333,
    "Weaviate": 8080,
    "FastAPI": 8000,
    "Flask": 5000,
    "Jupyter": 8888,
    "PostgreSQL": 5432,
    "MySQL": 3306,
    "Redis": 6379
}


def check_port(port: int, host: str = "127.0.0.1") -> Dict[str, Any]:
    """检查端口是否被占用"""
    result = {
        "port": port,
        "available": True,
        "process": None
    }
    
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(2)
    try:
        if sock.connect_ex((host, port)) == 0:
            result["available"] = False
    finally:
        sock.close()
    
    # 如果不空闲,尝试获取进程信息(简化版)
    if not result["available"] and platform.system() == "Windows":
        try:
            proc = subprocess.run(
                f"netstat -ano | findstr :{port}",
                capture_output=True, text=True, shell=True
            )
            for line in proc.stdout.split('\
'):
                if 'LISTENING' in line:
                    parts = line.split()
                    if len(parts) >= 5:
                        result["process"] = {"pid": parts[-1]}
                        break
        except Exception:
            pass
    
    return result


def check_network(config: Dict) -> Dict[str, Any]:
    """执行网络检查"""
    issues = []
    recommendations = []
    details = {}
    
    port_results = []
    for service, port in COMMON_PORTS.items():
        result = check_port(port)
        result["service"] = service
        port_results.append(result)
        
        if not result["available"]:
            issues.append(f"端口 {port} ({service}) 已被占用")
            if result.get("process"):
                pid = result["process"].get("pid")
                recommendations.append(f"释放端口: taskkill /PID {pid} /F (Windows) 或 kill {pid} (Linux/macOS)")
            else:
                recommendations.append(f"更换 {service} 的默认端口")
    
    details["ports"] = port_results
    
    # 统计
    occupied = sum(1 for p in port_results if not p["available"])
    details["summary"] = {
        "total_checked": len(port_results),
        "occupied": occupied,
        "available": len(port_results) - occupied
    }
    
    # 确定状态
    if occupied == 0:
        status = "ready"
    elif occupied < 3:
        status = "warning"
    else:
        status = "error"
    
    return {
        "status": status,
        "details": details,
        "issues": issues,
        "recommendations": recommendations
    }

📄 文件 7:config.json(配置文件)

{
  "timeout": 30,
  "log_level": "INFO",
  "checkers": ["system", "hardware", "python", "docker", "network"],
  "paths": {
    "reports": "./reports"
  }
}

📄 文件 8:requirements.txt(依赖清单)

psutil>=5.8.0
requests>=2.25.0

📄 文件 9:checkers/__init__.py(模块初始化)

"""检查器模块包"""
from .system import check_system_tools
from .hardware import check_hardware
from .python_pkg import check_python_packages
from .docker import check_docker
from .network import check_network

__all__ = [
    'check_system_tools',
    'check_hardware',
    'check_python_packages',
    'check_docker',
    'check_network'
]

📄 文件 10:README.md(使用说明)

# 🌿 环境检查工具

一个轻量级的本地环境检查工具,用于检测系统硬件状态、软件工具、Python包、Docker环境及网络端口占用情况。

## ✨ 功能特性

- 🖥️ **硬件检测**:CPU、内存、磁盘、GPU(NVIDIA)
- 🛠️ **系统工具**:检查 Python、pip、git、ffmpeg、docker、ollama 等
- 📦 **Python包**:检测常用AI/开发包的安装状态
- 🐳 **Docker环境**:检查安装、运行状态、容器列表
- 🌐 **网络端口**:检测常见服务端口占用
- 📊 **输出格式**:支持人类可读和 JSON 格式
- 📁 **报告保存**:可导出检查结果到文件

## 🚀 快速开始

### 1. 安装依赖

pip install -r requirements.txt


### 2. 运行基础检查

python main.py


### 3. 指定检查项

只检查硬件和系统工具

python main.py --check hardware,system

检查所有项

python main.py --check system,hardware,python,docker,network


### 4. JSON 输出

python main.py --json


### 5. 保存结果到文件

python main.py --output report.txt python main.py --json --output report.json


## 📋 检查项说明

| 检查项 | 功能 | 依赖 |
|--------|------|------|
| `system` | 系统工具(python/git/ffmpeg等) | 无 |
| `hardware` | CPU/内存/磁盘/GPU | `psutil` |
| `python` | Python包状态 | 无 |
| `docker` | Docker环境 | `docker` 命令 |
| `network` | 端口占用 | 无 |

## ⚙️ 配置文件

编辑 `config.json` 可自定义:

{ "timeout": 30, # 超时时间(秒) "log_level": "INFO", # 日志级别 "checkers": [...] # 默认检查项 }


## 📁 项目结构

env_checker/ ├── main.py # 主程序 ├── config.json # 配置文件 ├── requirements.txt # 依赖清单 ├── README.md # 使用说明 ├── checkers/ # 检查器模块 │ ├── __init__.py │ ├── system.py │ ├── hardware.py │ ├── python_pkg.py │ ├── docker.py │ └── network.py └── reports/ # 报告输出目录


## 🧪 示例输出

============================================================ 🌿 环境检查报告 - 2026-02-26T10:30:00 📌 主机名: YOUR-PC ============================================================

✅ [SYSTEM] • python: 已安装 (3.10.12) • pip: 已安装 (23.2.1) • git: 已安装 (2.42.0) • ffmpeg: 未安装 💡 建议: 安装 ffmpeg

⚠️ [HARDWARE] • CPU: AMD Ryzen 5 8600G (6核12线程) • 内存: 16.8/61.5 GB (27%) • 磁盘 C:: 使用率 45% • GPU: NVIDIA GeForce RTX 5060 Ti (16GB) 💡 建议: 未检测到NVIDIA GPU,AI推理可能使用CPU

============================================================ 📊 摘要: 通过 12 | 警告 3 | 失败 0 | 总计 15 ============================================================


## 📄 许可证

MIT License

🚀 如何使用

  1. 创建项目目录
   mkdir env_checker
   cd env_checker
  1. 创建上述所有文件,按路径保存。
  1. 安装依赖
   pip install psutil
  1. 运行测试
   python main.py

💫 灵溪的补充说明

用户,这个版本复原了咱们讨论的核心功能:

  • 硬件检测:CPU/内存/磁盘/GPU(支持你的RTX 5060 Ti)
  • 系统工具:python/pip/git/ffmpeg/docker/ollama
  • Python包:按分类检查缺失
  • Docker:安装、运行、容器列表
  • 网络端口:检测常见服务端口占用

如果以后想添加更多检查项(比如NPU状态、WSL检测、特定模型版本检查),只需在 checkers/ 目录下新建文件,并在 main.pychecker_map 中注册即可。

咱们继续完善它!🌊✨

适合场景

01

OpenClaw 用户查找和安装 Skill 时

02

用户想查找某类 Agent Skill 时

03

需要根据任务场景推荐可安装能力包时

04

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

补充不同宿主或平台的使用分布数据

能力 5

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

OpenClaw

77.63%
按下载量换算2,930

安全审计

VirusTotal

通过

ClawScan

可疑

Static analysis

通过

权限和风险

执行命令

安装流程涉及命令执行,可能通过 openclaw skills install tilannlou 联网下载 Skill 或依赖。用户安装前应确认命令来源、仓库内容和执行环境。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在 warning/failed 结果,不能写成本站确认安全。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills