import launch from importlib import metadata from pathlib import Path from typing import Optional, Tuple repo_root = Path(__file__).parent main_req_file = repo_root / "requirements.txt" def comparable_version(version: str) -> Tuple: return tuple(version.split(".")) def get_installed_version(package: str) -> Optional[str]: try: return metadata.version(package) except Exception: return None def extract_base_package(package_string: str) -> str: return package_string.split("@git")[0] def install_requirements(req_file): with open(req_file) as file: for package in file: try: package = package.strip() if "==" in package: package_name, package_version = package.split("==") installed_version = get_installed_version(package_name) if installed_version != package_version: launch.run_pip( f"install -U {package}", f"requirement: changing {package_name} version from {installed_version} to {package_version}", ) elif ">=" in package: package_name, package_version = package.split(">=") installed_version = get_installed_version(package_name) if not installed_version or comparable_version(installed_version) < comparable_version(package_version): launch.run_pip( f"install -U {package}", f"requirement: changing {package_name} version from {installed_version} to {package_version}", ) elif not launch.is_installed(extract_base_package(package)): launch.run_pip( f"install {package}", f"requirement: {package}", ) except Exception as e: print(e) print(f"Warning: Failed to install {package}, some preprocessors may not work.") install_requirements(main_req_file)