133 lines
4.1 KiB
Python
133 lines
4.1 KiB
Python
# -*- 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)
|