123 lines
3.7 KiB
Python
123 lines
3.7 KiB
Python
|
|
#!/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)
|