setup_env.py

#!/usr/bin/env python3
"""
AI Quant 项目环境配置脚本
面向用户,无代码门槛
"""

import sys
import os
import logging
import subprocess
import platform

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    handlers=[
        logging.StreamHandler()
    ]
)

logger = logging.getLogger("AIQuant.setup")


def check_python_version():
    """
    检查 Python 版本
    """
    logger.info(f"Python 版本: {sys.version}")

    major, minor = sys.version_info.major, sys.version_info.minor
    if major != 3 or minor < 8:
        logger.error("需要 Python 3.8 或更高版本")
        return False
    return True


def check_environment():
    """
    检查运行环境
    """
    logger.info(f"操作系统: {platform.system()} {platform.release()}")

    if platform.system() != "Windows":
        logger.warning("AI Quant 主要支持 Windows 10/11 系统")

    return True


def install_requirements():
    """
    安装依赖包
    """
    requirements_file = os.path.join(os.path.dirname(
        os.path.dirname(os.path.abspath(__file__))), "requirements.txt")

    logger.info(f"使用依赖文件: {requirements_file}")

    if not os.path.exists(requirements_file):
        logger.error(f"依赖文件不存在: {requirements_file}")
        return False

    try:
        logger.info("正在安装项目依赖...")
        result = subprocess.run(
            [sys.executable, "-m", "pip", "install", "-r", requirements_file],
            check=True,
            capture_output=True,
            text=True
        )
        logger.info(f"安装成功: {result.stdout}")
        return True
    except subprocess.CalledProcessError as e:
        logger.error(f"安装失败: {e}")
        logger.error(f"错误输出: {e.stderr}")
        return False


def check_dependencies():
    """
    检查依赖是否安装成功
    """
    logger.info("检查项目依赖是否安装成功...")

    try:
        import vnpy
        logger.info(f"vnpy 版本: {vnpy.__version__}")

        import pandas
        logger.info(f"pandas 版本: {pandas.__version__}")

        import numpy
        logger.info(f"numpy 版本: {numpy.__version__}")

        import PySide6
        logger.info(f"PySide6 版本: {PySide6.__version__}")

        logger.info("项目依赖检查通过")
        return True
    except ImportError as e:
        logger.error(f"依赖检查失败: {e}")
        return False


def main():
    """
    主入口函数
    """
    logger.info("AI Quant 项目环境配置开始")

    try:
        # 检查 Python 版本
        if not check_python_version():
            return False

        # 检查运行环境
        if not check_environment():
            return False

        # 安装依赖
        if not install_requirements():
            return False

        # 检查依赖是否安装成功
        if not check_dependencies():
            return False

        logger.info("AI Quant 项目环境配置完成")
        return True
    except Exception as e:
        logger.error(f"配置过程中出错: {e}")
        logger.exception("详细错误信息:")
        return False


if __name__ == "__main__":
    try:
        success = main()
        sys.exit(0 if success else 1)
    except KeyboardInterrupt:
        logger.info("程序被用户中断")
        sys.exit(0)