#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 依赖安装脚本 自动安装项目所需的依赖包 """ import subprocess import sys import os def install_package(package): """安装单个包""" try: print(f"正在安装 {package}...") result = subprocess.run([sys.executable, "-m", "pip", "install", package], capture_output=True, text=True) if result.returncode == 0: print(f"✅ {package} 安装成功") return True else: print(f"❌ {package} 安装失败: {result.stderr}") return False except Exception as e: print(f"❌ 安装 {package} 时出错: {e}") return False def install_requirements(): """从 requirements.txt 安装依赖""" try: print("正在从 requirements.txt 安装依赖...") result = subprocess.run([sys.executable, "-m", "pip", "install", "-r", "requirements.txt"], capture_output=True, text=True) if result.returncode == 0: print("✅ 所有依赖安装成功") return True else: print(f"❌ 依赖安装失败: {result.stderr}") return False except Exception as e: print(f"❌ 安装依赖时出错: {e}") return False def check_import(module_name): """检查模块是否可以导入""" try: __import__(module_name) return True except ImportError: return False def main(): """主函数""" print("=" * 50) print("KaMiXiTong 依赖安装脚本") print("=" * 50) # 检查 requirements.txt 是否存在 if not os.path.exists("requirements.txt"): print("❌ requirements.txt 文件不存在") return False # 尝试从 requirements.txt 安装 if install_requirements(): print("\n✅ 依赖安装完成!") else: print("\n⚠️ 从 requirements.txt 安装失败,尝试单独安装关键依赖...") # 关键依赖列表 critical_packages = [ "Flask==2.3.3", "Flask-SQLAlchemy==3.0.5", "Flask-Login==0.6.3", "PyMySQL==1.1.0", "python-dotenv==1.0.0", "cryptography==41.0.4", "SQLAlchemy>=2.0.0" # 确保使用 SQLAlchemy 2.0+ ] success_count = 0 for package in critical_packages: if install_package(package): success_count += 1 print(f"\n安装结果: {success_count}/{len(critical_packages)} 个包安装成功") # 检查关键模块是否可以导入 print("\n检查关键模块...") modules_to_check = [ ("flask", "Flask"), ("flask_sqlalchemy", "Flask-SQLAlchemy"), ("flask_login", "Flask-Login"), ("pymysql", "PyMySQL"), ("cryptography", "cryptography"), ("dotenv", "python-dotenv"), ("sqlalchemy", "SQLAlchemy") ] all_good = True for module, name in modules_to_check: if check_import(module): print(f"✅ {name} 可用") else: print(f"❌ {name} 不可用") all_good = False if all_good: print("\n🎉 所有依赖检查通过!现在可以运行 init_db.py 了。") print("\n下一步:") print(" python test_crypto.py # 测试加密功能") print(" python init_db.py # 初始化数据库") else: print("\n⚠️ 部分依赖仍有问题,请手动安装或检查网络连接。") print("\n手动安装命令:") print(" pip install -r requirements.txt") print(" 或") print(" pip install cryptography==41.0.4") return all_good if __name__ == "__main__": success = main() sys.exit(0 if success else 1)