ComfyUI 的六类目录与覆盖优先级:`--base-directory` 和五个单项参数谁说了算

2026-08-09

装完 ComfyUI 之后迟早会遇到一件事:系统盘塞不下了。模型往 D 盘搬,输出往 NAS 上写,临时文件想扔到一块便宜的机械盘上,用户配置又希望跟着人走而不是跟着代码走。ComfyUI 为这件事准备了两套参数,一套是「一把抓」,一套是「精确覆盖」,它们可以同时出现在一条命令里——而同时出现时谁赢、哪个路径写错了会当场报错、哪个写错了会一声不吭地生效,这几件事决定了你是十分钟搞定还是排查半天。

下面的参数名、默认值和 help 语义,一律以 ComfyUI v0.31.0(核对日 2026-08-09)的 comfy/cli_args.py 为准。ComfyUI 的版本节奏很快,参数和默认值都会变,看到本文和你机器上 python main.py --help 的输出不一致时,以你自己那份输出为准。

一、先认清「六类目录」这个划分

--base-directory 的 help 说得很明确:它一次性设置 models、custom_nodes、input、output、temp、user 这六类目录的基准目录。也就是说,ComfyUI 眼里的可搬迁状态被切成了这六块:

目录类别大致职责
models模型文件所在的根目录
custom_nodes自定义节点所在的目录
input工作流读取的输入文件目录
output生成结果的输出目录
temp临时文件目录,默认在 ComfyUI 目录内
user用户数据与配置目录

这个划分本身就是一条有用的信息:它告诉你 ComfyUI 认为哪些东西是「实例状态」而不是「程序代码」。你要做多实例、要把整套东西挪到另一块盘、要在容器里把状态挂成一个卷,对着这六类去规划就不会漏。

二、覆盖优先级:单项赢,而且只有五个单项

v0.31.0 的目录相关参数一共是这些:

参数help / 源码要点
--base-directory一次性设置 models、custom_nodes、input、output、temp、user 六类目录的基准目录
--output-directory设置输出目录,Overrides --base-directory
--temp-directory设置 temp 目录(默认在 ComfyUI 目录内),Overrides --base-directory
--input-directory设置输入目录,Overrides --base-directory
--user-directory绝对路径,设置 user 目录,Overrides --base-directory,会校验路径存在、是目录、可读
--models-directory设置 models 目录,覆盖 --base-directory 里的 models 文件夹,同样会校验
--extra-model-paths-config PATH [PATH ...]加载一个或多个 extra_model_paths.yaml 文件,可重复 append

这张表要横着读两遍。

第一遍看 Overrides:五个单项参数的 help 里都写了「Overrides --base-directory」。所以优先级没有任何模糊空间——两者同时给时,单项参数赢--base-directory 更像一个兜底的默认值,谁没被单项指定,谁就落到 base 底下。这也意味着你完全可以写「大部分搬到 D 盘,只有输出走 NAS」这种混搭,不需要把六个目录一个个手写。

第二遍看谁不在表里:六类目录中,custom_nodes 在这份参数清单里没有对应的单项覆盖参数。models、input、output、temp、user 各有一个,唯独自定义节点目录只能跟着 --base-directory 走。这是个容易被忽略的不对称——如果你的目标是「把自定义节点目录挪出去」,那么你没得选,只能用 --base-directory,并顺带接受其余五类也一起搬(除非再用单项参数把它们逐个拽回来)。反过来,如果你只是想搬模型,用 --models-directory 就够了,别动 base,免得把 custom_nodes 一起带走、再花时间想「我的节点怎么全没了」。

三、一个反直觉的差异:两类参数的路径校验强度不一样

这是本文最值得记住的一条。

--user-directory--models-directory 会走 is_valid_directory 校验:路径必须已经存在、必须是一个目录、必须可读,三条里有一条不满足,这道校验就过不去。而 --base-directory 在源码里没有走这个校验

由此推出两种性质完全不同的处境,排查时的动作也不同:

处境一:--models-directory--user-directory 路径写错。 这种反而好办——校验不通过就是答案,去核对那个路径是不是真的存在、是不是被你写成了文件而不是目录、当前用户对它有没有读权限。Windows 上还要多看一眼盘符和网络映射盘:映射盘在服务或计划任务的上下文里未必可见,人肉双击资源管理器能打开,不代表进程能打开(这属于通用 Windows 运维经验,不是 ComfyUI 文档里的内容)。

处境二:--base-directory 路径写错。 因为它不走那道校验,你就不能指望它像上面两个参数一样替你把错路径拦下来。至于路径写错之后 ComfyUI 具体会有什么表现,官方 help 与 README 都没有写,本文不替它猜。但有一条判断依据是明确的:「启动没有因为路径被拦下」并不等于「路径写对了」——这两件事在 --base-directory 上是脱钩的,而在另外两个参数上是绑定的。

所以碰到处境二,别一头扎进节点或模型加载逻辑里去猜。先做一个动作:看启动日志里的 base 目录那一行。ComfyUI v0.26.0(2026-06-23)的更新里有一条就是「使用 --base-directory 时把 base 目录打进启动日志」(PR #13370)。也就是说,在 v0.26.0 及之后的版本上,你不需要猜 base 到底指到了哪里,日志会告诉你。把日志里那一行的路径复制出来,到文件管理器或 ls 里贴一遍,路径对不对立刻见分晓。

顺带一个版本提醒:如果你跑的是 v0.26.0 之前的版本,启动日志里没有这一行,那就只能靠核对命令行本身。这也是「引用版本相关结论必须带版本号」的现实理由——同一个排查动作,在旧版本上根本不存在。

四、--extra-model-paths-config 是另一套机制,别和目录参数混用思路

很多人把 --models-directoryextra_model_paths.yaml 当成同一件事的两种写法,其实它们解决的是不同问题。

  • --models-directory搬家:告诉 ComfyUI「models 根目录换到这里」。
  • --extra-model-paths-config加搜索路径:加载一个或多个 extra_model_paths.yaml,而且这个参数可以重复 append,多份配置能叠加。

README 里对这份 yaml 的定位是:仓库里带了 extra_model_paths.yaml.example,把它改名为 extra_model_paths.yaml 并编辑,就能设置模型搜索路径、与其它 UI 共享模型;在 standalone windows 构建里,这个文件位于 ComfyUI 目录下。

所以判断依据可以简化成一句话:模型只有一处、想整体换位置,用目录参数;模型分散在多处、或要和别的 UI 共用同一份权重,用 yaml。 后者能重复 append 这一点很实用——比如一份 yaml 描述本机 SSD 上的常用模型,另一份描述挂载的共享存储,需要哪几份就在命令行上叠哪几份,不用去改一个巨大的配置文件。

五、怎么组合:三种常见处境

处境 A:系统盘满了,整套状态搬到 D 盘。 目标是六类一起走,用 --base-directory 最省事,custom_nodes 也只有这条路。

处境 B:只有模型太大,其它都还好。--models-directory,不要动 base。好处是自定义节点、user 配置、历史都留在原地,出问题时可变因素少。

处境 C:整体搬走,但输出要写到别的地方(比如共享盘或大容量盘)。 base 打底,再用 --output-directory 把 output 单独拽出来。这正是「单项 Overrides base」的典型用法:

python main.py --base-directory D:\ComfyData --output-directory E:\ComfyOutput

Linux / macOS 侧写法同理,只是路径分隔符和盘符不同:

python main.py --base-directory /data/comfy --output-directory /mnt/nas/comfy-output

以上为按官方参数语义组合的示例,未逐项实测,以官方文档与 --help 输出为准。路径里含空格时按你所用 shell 的惯例加引号,这属于通用命令行习惯,不是 ComfyUI 的特殊规定。

六、改完之后怎么验证

  1. 先看日志:v0.26.0 及以后,启动日志里有 base 目录那一行,核对它是不是你想要的位置。
  2. 再看落盘:跑一次工作流,去 --output-directory 指定的位置确认文件确实写在那儿,而不是老目录。输出目录是最容易验证的一类,因为它有实实在在的产物。
  3. 最后看清单:模型列表能不能刷出来,自定义节点有没有加载。如果 models 空了但节点在,问题多半出在 models 侧(目录参数或 yaml);如果节点也没了,那就要怀疑是不是整个 base 指错了地方。

这个「日志 → 落盘 → 清单」的顺序不是随便排的:它从最不依赖运行结果的证据开始,逐步走到需要跑一次才能看到的证据,能少跑几次是几次。

七、什么情况说明不是目录参数的问题

也给一条退出条件,免得一条道走到黑:

  • 如果你根本没加任何目录参数,模型却读不到,那和覆盖优先级无关,去查模型文件本身放的位置对不对。README 的口径是小模型只需要把 ckpt/safetensors 放进 ComfyUI\models\checkpoints,很多大模型有多个文件、要按说明分别放进 ComfyUI\models\ 下的对应子目录——多文件模型只放对了一个,现象也会像「模型没识别」。
  • 如果 --models-directory--user-directory 给的路径没能通过校验,那是 is_valid_directory 在起作用,问题在路径本身(不存在 / 不是目录 / 不可读),不是优先级问题。这一类不用往覆盖关系上想。
  • 如果模型能加载、只是输出找不到,先确认是不是被 --output-directory 覆盖了 base——按 help 的 Overrides 声明,这两个参数同时存在时输出以单项参数为准。

最后提一句和目录无关但同属「Overrides 家族」的参数,方便你举一反三:--front-end-root 的 help 也写了 Overrides --front-end-version,并且同样会校验目录存在与可读。可以放心用的规律只有前半句——凡是 help 里写了 Overrides,就是一条明确的优先级声明,不用再去别处求证。至于校验,v0.31.0 里能确认走目录校验的就是 --user-directory--models-directory--front-end-root 这三个,别的参数 help 没写,就别替它假设有校验。看到新参数时先在 --help 输出里搜一下 Overrides 这个词,比翻文档快。

延伸阅读


本文依据 ComfyUI 官方仓库(github.com/Comfy-Org/ComfyUI)的 README、comfy/cli_args.py、 release notes 与官方安全公告整理,核对日 2026-08-09,对应版本 v0.31.0; 文中引用的 issue 状态为该日期的快照。本文内容为官方文档与源码口径,非本机实测。 参数、默认值与功能随版本变动,请以官方文档与 python main.py --help 的实际输出为准。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。