# -*- coding: utf-8 -*- """ 수동 의존성 수정 도구 - 관리자 권한으로 실행하여 의존성 문제를 해결합니다. """ import subprocess import sys import os # 호환성을 위한 고정 버전 REQUIRED_VERSIONS = { 'numpy': '1.26.4', 'scipy': '1.11.4', 'onnxruntime': '1.18.1', 'opencv-python': '4.8.1.78', } def is_admin(): """관리자 권한으로 실행 중인지 확인합니다.""" try: return os.getuid() == 0 except AttributeError: # Windows try: import ctypes return ctypes.windll.shell32.IsUserAnAdmin() except: return False def run_as_admin(): """관리자 권한으로 재실행합니다.""" try: if sys.platform == 'win32': import ctypes ctypes.windll.shell32.ShellExecuteW( None, "runas", sys.executable, f'"{__file__}"', None, 1 ) else: os.execvp('sudo', ['sudo', sys.executable] + sys.argv) except Exception as e: print(f"관리자 권한 실행 실패: {e}") return False return True def force_reinstall_package(package_name, version): """패키지를 강제로 재설치합니다.""" try: package_spec = f"{package_name}=={version}" print(f"\n🔄 {package_spec} 강제 재설치 중...") # 1단계: 완전 제거 print(f"1️⃣ {package_name} 완전 제거 중...") uninstall_cmd = [ sys.executable, '-m', 'pip', 'uninstall', '-y', package_name ] subprocess.run(uninstall_cmd, check=False) # 2단계: 캐시 정리 print("2️⃣ pip 캐시 정리 중...") cache_cmd = [sys.executable, '-m', 'pip', 'cache', 'purge'] subprocess.run(cache_cmd, check=False) # 3단계: 강제 재설치 print(f"3️⃣ {package_spec} 설치 중...") install_cmd = [ sys.executable, '-m', 'pip', 'install', '--force-reinstall', '--no-cache-dir', package_spec ] result = subprocess.run(install_cmd, capture_output=True, text=True) if result.returncode == 0: print(f"✅ {package_spec} 설치 완료!") return True else: print(f"❌ {package_spec} 설치 실패:") print(result.stderr) return False except Exception as e: print(f"💥 {package_name} 처리 중 오류: {e}") return False def main(): """메인 함수""" print("🔧 의존성 수동 수정 도구") print("=" * 50) # 관리자 권한 확인 if not is_admin(): print("⚠️ 관리자 권한이 필요합니다.") print("관리자 권한으로 재실행 중...") if run_as_admin(): return 0 else: print("❌ 관리자 권한 실행 실패") return 1 print("✅ 관리자 권한으로 실행 중") success_count = 0 total_count = len(REQUIRED_VERSIONS) for package_name, required_version in REQUIRED_VERSIONS.items(): print(f"\n{'='*20} {package_name} {'='*20}") if force_reinstall_package(package_name, required_version): success_count += 1 else: print(f"⚠️ {package_name} 처리 실패") print(f"\n{'='*50}") print(f"📊 결과: {success_count}/{total_count} 패키지 처리 완료") if success_count == total_count: print("🎉 모든 의존성이 성공적으로 설치되었습니다!") return 0 else: print("⚠️ 일부 패키지 설치에 실패했습니다.") return 1 if __name__ == "__main__": try: exit_code = main() input("\n아무 키나 눌러 종료하세요...") sys.exit(exit_code) except KeyboardInterrupt: print("\n⚠️ 사용자에 의해 중단됨") sys.exit(1) except Exception as e: print(f"\n💥 예상치 못한 오류: {e}") input("아무 키나 눌러 종료하세요...") sys.exit(1)