diff --git a/launch.py b/launch.py index 8f7e27d4..085d02cc 100644 --- a/launch.py +++ b/launch.py @@ -2,10 +2,11 @@ import os import sys import platform -from modules.launch_util import commit_hash, fooocus_tag, is_installed, run, python, run_pip, repo_dir, git_clone +from modules.launch_util import commit_hash, fooocus_tag, is_installed, run, python, \ + run_pip, repo_dir, git_clone, requirements_met -REINSTALL_ALL = True +REINSTALL_ALL = False def prepare_environment(): @@ -42,6 +43,10 @@ def prepare_environment(): elif platform.system() == "Linux": run_pip(f"install -U -I --no-deps {xformers_package}", "xformers") + if REINSTALL_ALL or not requirements_met(requirements_file): + run_pip(f"install -r \"{requirements_file}\"", "requirements") + + return prepare_environment() diff --git a/modules/launch_util.py b/modules/launch_util.py index a14e8094..63f329b3 100644 --- a/modules/launch_util.py +++ b/modules/launch_util.py @@ -2,6 +2,7 @@ import os import importlib import subprocess import sys +import re from functools import lru_cache @@ -95,3 +96,41 @@ def run(command, desc=None, errdesc=None, custom_env=None, live: bool = default_ def run_pip(command, desc=None, live=default_command_live): index_url_line = f' --index-url {index_url}' if index_url != '' else '' return run(f'"{python}" -m pip {command} --prefer-binary{index_url_line}', desc=f"Installing {desc}", errdesc=f"Couldn't install {desc}", live=live) + + +re_requirement = re.compile(r"\s*([-_a-zA-Z0-9]+)\s*(?:==\s*([-+_.a-zA-Z0-9]+))?\s*") + + +def requirements_met(requirements_file): + """ + Does a simple parse of a requirements.txt file to determine if all rerqirements in it + are already installed. Returns True if so, False if not installed or parsing fails. + """ + + import importlib.metadata + import packaging.version + + with open(requirements_file, "r", encoding="utf8") as file: + for line in file: + if line.strip() == "": + continue + + m = re.match(re_requirement, line) + if m is None: + return False + + package = m.group(1).strip() + version_required = (m.group(2) or "").strip() + + if version_required == "": + continue + + try: + version_installed = importlib.metadata.version(package) + except Exception: + return False + + if packaging.version.parse(version_required) != packaging.version.parse(version_installed): + return False + + return True