From 415cb80bd0998a213d16706d08256b66c8e10c48 Mon Sep 17 00:00:00 2001 From: Brennan Kinney <5098581+polarathene@users.noreply.github.com> Date: Wed, 14 May 2025 18:19:02 +1200 Subject: [PATCH 1/3] fix: Should gracefully handle missing dirs --- folder_paths.py | 6 ------ main.py | 24 ++++++++++++++++++++++-- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/folder_paths.py b/folder_paths.py index f0b3fd10373..bde210e8f55 100644 --- a/folder_paths.py +++ b/folder_paths.py @@ -93,12 +93,6 @@ def map_legacy(folder_name: str) -> str: "clip": "text_encoders"} return legacy.get(folder_name, folder_name) -if not os.path.exists(input_directory): - try: - os.makedirs(input_directory) - except: - logging.error("Failed to create input directory") - def set_output_directory(output_dir: str) -> None: global output_directory output_directory = output_dir diff --git a/main.py b/main.py index 221e48e41e6..ef8f843d3cc 100644 --- a/main.py +++ b/main.py @@ -55,6 +55,21 @@ def apply_custom_paths(): folder_paths.set_user_directory(user_dir) +# These are created at startup if missing. Other data directories are created on-demand when needed. +def create_data_folders(): + data_dirs = [ + folder_paths.get_input_directory(), + folder_paths.get_temp_directory() + ] + + for dir_path in data_dirs: + if not os.path.exists(dir_path): + try: + os.makedirs(dir_path) + except: + logging.error(f"Failed to create directory: {dir_path}") + + def execute_prestartup_script(): def execute_script(script_path): module_name = os.path.splitext(script_path)[0] @@ -72,7 +87,11 @@ def execute_script(script_path): node_paths = folder_paths.get_folder_paths("custom_nodes") for custom_node_path in node_paths: - possible_modules = os.listdir(custom_node_path) + if not os.path.exists(custom_node_path): + logging.warning(f"Directory {custom_node_path} for custom nodes does not exist, skipping") + continue + + possible_modules = os.listdir(os.path.realpath(custom_node_path)) node_prestartup_times = [] for possible_module in possible_modules: @@ -95,7 +114,9 @@ def execute_script(script_path): logging.info("{:6.1f} seconds{}: {}".format(n[0], import_message, n[1])) logging.info("") + apply_custom_paths() +create_data_folders() execute_prestartup_script() @@ -283,7 +304,6 @@ def start_comfyui(asyncio_loop=None): if args.quick_test_for_ci: exit(0) - os.makedirs(folder_paths.get_temp_directory(), exist_ok=True) call_on_start = None if args.auto_launch: def startup_server(scheme, address, port): From edc85f010c8c002c5f2402fa0cea15c13505c200 Mon Sep 17 00:00:00 2001 From: Brennan Kinney <5098581+polarathene@users.noreply.github.com> Date: Wed, 14 May 2025 19:01:00 +1200 Subject: [PATCH 2/3] chore: Co-locate `args.temp_directory` --- main.py | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/main.py b/main.py index ef8f843d3cc..597b7d39f1a 100644 --- a/main.py +++ b/main.py @@ -30,7 +30,22 @@ def apply_custom_paths(): for config_path in itertools.chain(*args.extra_model_paths_config): utils.extra_config.load_extra_path_config(config_path) - # --output-directory, --input-directory, --user-directory + # --temp-directory, --user-directory, --input-directory, --output-directory + if args.temp_directory: + temp_dir = os.path.join(os.path.abspath(args.temp_directory), "temp") + logging.info(f"Setting temp directory to: {temp_dir}") + folder_paths.set_temp_directory(temp_dir) + + if args.user_directory: + user_dir = os.path.abspath(args.user_directory) + logging.info(f"Setting user directory to: {user_dir}") + folder_paths.set_user_directory(user_dir) + + if args.input_directory: + input_dir = os.path.abspath(args.input_directory) + logging.info(f"Setting input directory to: {input_dir}") + folder_paths.set_input_directory(input_dir) + if args.output_directory: output_dir = os.path.abspath(args.output_directory) logging.info(f"Setting output directory to: {output_dir}") @@ -44,16 +59,6 @@ def apply_custom_paths(): os.path.join(folder_paths.get_output_directory(), "diffusion_models")) folder_paths.add_model_folder_path("loras", os.path.join(folder_paths.get_output_directory(), "loras")) - if args.input_directory: - input_dir = os.path.abspath(args.input_directory) - logging.info(f"Setting input directory to: {input_dir}") - folder_paths.set_input_directory(input_dir) - - if args.user_directory: - user_dir = os.path.abspath(args.user_directory) - logging.info(f"Setting user directory to: {user_dir}") - folder_paths.set_user_directory(user_dir) - # These are created at startup if missing. Other data directories are created on-demand when needed. def create_data_folders(): @@ -271,10 +276,6 @@ def start_comfyui(asyncio_loop=None): Starts the ComfyUI server using the provided asyncio event loop or creates a new one. Returns the event loop, server instance, and a function to start the server asynchronously. """ - if args.temp_directory: - temp_dir = os.path.join(os.path.abspath(args.temp_directory), "temp") - logging.info(f"Setting temp directory to: {temp_dir}") - folder_paths.set_temp_directory(temp_dir) cleanup_temp() if args.windows_standalone_build: From 5b1bbaff087f832792c5062d12a236e8af5e3c6f Mon Sep 17 00:00:00 2001 From: Brennan Kinney <5098581+polarathene@users.noreply.github.com> Date: Wed, 14 May 2025 19:03:32 +1200 Subject: [PATCH 3/3] chore: Co-locate `--user-directory` arg --- comfy/cli_args.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/comfy/cli_args.py b/comfy/cli_args.py index de292d9b323..afa44425650 100644 --- a/comfy/cli_args.py +++ b/comfy/cli_args.py @@ -44,9 +44,10 @@ def __call__(self, parser, namespace, values, option_string=None): parser.add_argument("--base-directory", type=str, default=None, help="Set the ComfyUI base directory for models, custom_nodes, input, output, temp, and user directories.") parser.add_argument("--extra-model-paths-config", type=str, default=None, metavar="PATH", nargs='+', action='append', help="Load one or more extra_model_paths.yaml files.") +parser.add_argument("--input-directory", type=str, default=None, help="Set the ComfyUI input directory. Overrides --base-directory.") parser.add_argument("--output-directory", type=str, default=None, help="Set the ComfyUI output directory. Overrides --base-directory.") parser.add_argument("--temp-directory", type=str, default=None, help="Set the ComfyUI temp directory (default is in the ComfyUI directory). Overrides --base-directory.") -parser.add_argument("--input-directory", type=str, default=None, help="Set the ComfyUI input directory. Overrides --base-directory.") +parser.add_argument("--user-directory", type=is_valid_directory, default=None, help="Set the ComfyUI user directory with an absolute path. Overrides --base-directory.") parser.add_argument("--auto-launch", action="store_true", help="Automatically launch ComfyUI in the default browser.") parser.add_argument("--disable-auto-launch", action="store_true", help="Disable auto launching the browser.") parser.add_argument("--cuda-device", type=int, default=None, metavar="DEVICE_ID", help="Set the id of the cuda device this instance will use.") @@ -191,8 +192,6 @@ def is_valid_directory(path: str) -> str: help="The local filesystem path to the directory where the frontend is located. Overrides --front-end-version.", ) -parser.add_argument("--user-directory", type=is_valid_directory, default=None, help="Set the ComfyUI user directory with an absolute path. Overrides --base-directory.") - parser.add_argument("--enable-compress-response-body", action="store_true", help="Enable compressing response body.") parser.add_argument(