|
|
|
import datetime
|
|
|
|
import os
|
|
|
|
import subprocess
|
|
|
|
import sys
|
|
|
|
import atexit
|
|
|
|
import threading
|
|
|
|
import re
|
|
|
|
|
|
|
|
try:
|
|
|
|
# Logger setup
|
|
|
|
if os.path.exists("comfyui.log"):
|
|
|
|
if os.path.exists("comfyui.prev.log"):
|
|
|
|
if os.path.exists("comfyui.prev2.log"):
|
|
|
|
os.remove("comfyui.prev2.log")
|
|
|
|
os.rename("comfyui.prev.log", "comfyui.prev2.log")
|
|
|
|
os.rename("comfyui.log", "comfyui.prev.log")
|
|
|
|
|
|
|
|
original_stdout = sys.stdout
|
|
|
|
original_stderr = sys.stderr
|
|
|
|
|
|
|
|
tqdm = r'\d+%.*\[(.*?)\]'
|
|
|
|
|
|
|
|
log_file = open("comfyui.log", "w", encoding="utf-8")
|
|
|
|
log_lock = threading.Lock()
|
|
|
|
|
|
|
|
class Logger:
|
|
|
|
def __init__(self, is_stdout):
|
|
|
|
self.is_stdout = is_stdout
|
|
|
|
|
|
|
|
def fileno(self):
|
|
|
|
try:
|
|
|
|
if self.is_stdout:
|
|
|
|
return original_stdout.fileno()
|
|
|
|
else:
|
|
|
|
return original_stderr.fileno()
|
|
|
|
except AttributeError:
|
|
|
|
# Handle error
|
|
|
|
raise ValueError("The object does not have a fileno method")
|
|
|
|
|
|
|
|
def write(self, message):
|
|
|
|
if not self.is_stdout:
|
|
|
|
match = re.search(tqdm, message)
|
|
|
|
if match:
|
|
|
|
message = re.sub(r'([#|])\d', r'\1▌', message)
|
|
|
|
message = re.sub('#', '█', message)
|
|
|
|
if '100%' in message:
|
|
|
|
self.sync_write(message)
|
|
|
|
else:
|
|
|
|
original_stderr.write(message)
|
|
|
|
original_stderr.flush()
|
|
|
|
else:
|
|
|
|
self.sync_write(message)
|
|
|
|
else:
|
|
|
|
self.sync_write(message)
|
|
|
|
|
|
|
|
def sync_write(self, message):
|
|
|
|
with log_lock:
|
|
|
|
log_file.write(message)
|
|
|
|
log_file.flush()
|
|
|
|
|
|
|
|
if self.is_stdout:
|
|
|
|
original_stdout.write(message)
|
|
|
|
original_stdout.flush()
|
|
|
|
else:
|
|
|
|
original_stderr.write(message)
|
|
|
|
original_stderr.flush()
|
|
|
|
|
|
|
|
def flush(self):
|
|
|
|
log_file.flush()
|
|
|
|
if self.is_stdout:
|
|
|
|
original_stdout.flush()
|
|
|
|
else:
|
|
|
|
original_stderr.flush()
|
|
|
|
|
|
|
|
|
|
|
|
def handle_stream(stream, prefix):
|
|
|
|
for line in stream:
|
|
|
|
print(prefix, line, end="")
|
|
|
|
|
|
|
|
|
|
|
|
def close_log():
|
|
|
|
log_file.close()
|
|
|
|
|
|
|
|
|
|
|
|
sys.stdout = Logger(True)
|
|
|
|
sys.stderr = Logger(False)
|
|
|
|
|
|
|
|
atexit.register(close_log)
|
|
|
|
except Exception as e:
|
|
|
|
print(f"[ComfyUI-Manager] Logging failed: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
print("** ComfyUI start up time:", datetime.datetime.now())
|
|
|
|
|
|
|
|
|
|
|
|
# Perform install
|
|
|
|
script_list_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "startup-scripts", "install-scripts.txt")
|
|
|
|
|
|
|
|
# Check if script_list_path exists
|
|
|
|
if os.path.exists(script_list_path):
|
|
|
|
print("\n#######################################################################")
|
|
|
|
print("[ComfyUI-Manager] Starting dependency installation/(de)activation for the extension\n")
|
|
|
|
|
|
|
|
executed = set()
|
|
|
|
# Read each line from the file and convert it to a list using eval
|
|
|
|
with open(script_list_path, 'r') as file:
|
|
|
|
for line in file:
|
|
|
|
if line in executed:
|
|
|
|
continue
|
|
|
|
|
|
|
|
executed.add(line)
|
|
|
|
|
|
|
|
try:
|
|
|
|
script = eval(line)
|
|
|
|
print(f"\n## ComfyUI-Manager: EXECUTE => {script[1:]}")
|
|
|
|
|
|
|
|
print(f"\n## Execute install/(de)activation script for '{script[0]}'")
|
|
|
|
process = subprocess.Popen(script[1:], cwd=script[0], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, bufsize=1)
|
|
|
|
|
|
|
|
stdout_thread = threading.Thread(target=handle_stream, args=(process.stdout, ""))
|
|
|
|
stderr_thread = threading.Thread(target=handle_stream, args=(process.stderr, "[!]"))
|
|
|
|
|
|
|
|
stdout_thread.start()
|
|
|
|
stderr_thread.start()
|
|
|
|
|
|
|
|
stdout_thread.join()
|
|
|
|
stderr_thread.join()
|
|
|
|
|
|
|
|
exit_code = process.wait()
|
|
|
|
|
|
|
|
if exit_code != 0:
|
|
|
|
print(f"install/(de)activation script failed: {script[0]}")
|
|
|
|
except Exception as e:
|
|
|
|
print(f"[ERROR] Failed to execute install/(de)activation script: {line} / {e}")
|
|
|
|
|
|
|
|
# Remove the script_list_path file
|
|
|
|
if os.path.exists(script_list_path):
|
|
|
|
os.remove(script_list_path)
|
|
|
|
|
|
|
|
print("\n[ComfyUI-Manager] Startup script completed.")
|
|
|
|
print("#######################################################################\n")
|
|
|
|
|