diff --git a/__init__.py b/__init__.py index 095f7d23..ca71fc7b 100644 --- a/__init__.py +++ b/__init__.py @@ -14,7 +14,7 @@ import concurrent import ssl from urllib.parse import urlparse -version = "V1.1.3" +version = "V1.2" print(f"### Loading: ComfyUI-Manager ({version})") diff --git a/prestartup_script.py b/prestartup_script.py index d5bfe941..942d7302 100644 --- a/prestartup_script.py +++ b/prestartup_script.py @@ -168,7 +168,7 @@ def check_bypass_ssl(): default_conf = config['default'] if 'bypass_ssl' in default_conf and default_conf['bypass_ssl'].lower() == 'true': - print(f"[ComfyUI-Manager] WARN: Unsafe - SSL verification option is Enabled. (see ComfyUI-Manager/config.ini)") + print(f"[ComfyUI-Manager] WARN: Unsafe - SSL verification bypass option is Enabled. (see ComfyUI-Manager/config.ini)") ssl._create_default_https_context = ssl._create_unverified_context # SSL certificate error fix. except Exception: pass @@ -177,6 +177,37 @@ def check_bypass_ssl(): check_bypass_ssl() +# Perform install +processed_install = set() +script_list_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "startup-scripts", "install-scripts.txt") +pip_list = None + + +def get_installed_packages(): + global pip_list + + if pip_list is None: + try: + result = subprocess.check_output([sys.executable, '-m', 'pip', 'list'], universal_newlines=True) + pip_list = set([line.split()[0].lower() for line in result.split('\n') if line.strip()]) + except subprocess.CalledProcessError as e: + print(f"[ComfyUI-Manager] Failed to retrieve the information of installed pip packages.") + return set() + + return pip_list + + +def is_installed(name): + name = name.strip() + pattern = r'([^<>!=]+)([<>!=]=?)' + match = re.search(pattern, name) + + if match: + name = match.group(1) + + return name.lower() in get_installed_packages() + + if os.path.exists(restore_snapshot_path): try: import json @@ -225,11 +256,12 @@ if os.path.exists(restore_snapshot_path): with open(requirements_path, 'r', encoding="UTF-8") as file: for line in file: package_name = line.strip() - if package_name: + if package_name and not is_installed(package_name): install_cmd = [sys.executable, "-m", "pip", "install", package_name] this_exit_code += process_wrap(install_cmd, repo_path) - if os.path.exists(install_script_path): + if os.path.exists(install_script_path) and f'{repo_path}/install.py' not in processed_install: + processed_install.add(f'{repo_path}/install.py') install_cmd = [sys.executable, install_script_path] print(f">>> {install_cmd} / {repo_path}") this_exit_code += process_wrap(install_cmd, repo_path) @@ -253,26 +285,25 @@ if os.path.exists(restore_snapshot_path): os.remove(restore_snapshot_path) -# Perform install -script_list_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "startup-scripts", "install-scripts.txt") - - def execute_lazy_install_script(repo_path, executable): + global processed_install + install_script_path = os.path.join(repo_path, "install.py") requirements_path = os.path.join(repo_path, "requirements.txt") if os.path.exists(requirements_path): - print("Install: pip packages") + print(f"Install: pip packages for '{repo_path}'") with open(requirements_path, "r") as requirements_file: for line in requirements_file: package_name = line.strip() - if package_name: - install_cmd = [sys.executable, "-m", "pip", "install", package_name] + if package_name and not is_installed(package_name): + install_cmd = [executable, "-m", "pip", "install", package_name] process_wrap(install_cmd, repo_path) - if os.path.exists(install_script_path): - print(f"Install: install script") - install_cmd = [sys.executable, "install.py"] + if os.path.exists(install_script_path) and f'{repo_path}/install.py' not in processed_install: + processed_install.add(f'{repo_path}/install.py') + print(f"Install: install script for '{repo_path}'") + install_cmd = [executable, "install.py"] process_wrap(install_cmd, repo_path) @@ -298,9 +329,12 @@ if os.path.exists(script_list_path): execute_lazy_install_script(script[0], script[2]) elif os.path.exists(script[0]): - print(f"\n## ComfyUI-Manager: EXECUTE => {script[1:]}") + if 'pip' in script[1:] and 'install' in script[1:] and is_installed(script[-1]): + continue + print(f"\n## ComfyUI-Manager: EXECUTE => {script[1:]}") print(f"\n## Execute install/(de)activation script for '{script[0]}'") + exit_code = process_wrap(script[1:], script[0]) if exit_code != 0: @@ -318,3 +352,5 @@ if os.path.exists(script_list_path): print("\n[ComfyUI-Manager] Startup script completed.") print("#######################################################################\n") +del processed_install +del pip_list \ No newline at end of file