You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何shutil.copytree与distutils.copy_tree仅复制目录内容而非目录本身?

问题:Python copy_tree/copytree复制目录时未生成目标子目录

场景与问题

在Windows系统使用Python 3.11,想要将comfyui\js目录完整复制到T:\temp,预期最终生成T:\temp\js目录并包含原目录的所有内容。但调用以下代码时:

distutils.dir_util.copy_tree("comfyui/js","T:/temp")
# 或
shutil.copytree("comfyui/js","T:/temp")

实际结果是comfyui/js下的内容被直接复制到T:\temp根目录,并未创建T:\temp\js,示例执行后生成的文件路径如下:

['T:/temp\\green_diamond_00.png', 'T:/temp\\green_pixel_00.png', 'T:/temp\\green_square_8x8.png', 'T:/temp\\image_transceiver_controller.js', 'T:/temp\\magic_lamp_160x86.png', 'T:/temp\\pict_cha_mockup.html']

原因解析

这两个函数的设计逻辑是复制源目录的内容到目标目录,而非复制源目录本身。当你指定目标路径为T:/temp时,函数会将源目录下的所有内容直接放入该目标路径(如果目标目录不存在则自动创建),不会自动在目标路径下生成与源目录同名的子目录。这是函数的预期行为,并非bug。

解决办法

方法1:直接指定包含子目录的目标路径

明确将目标路径设为T:/temp/js,函数会自动创建该子目录并完成内容复制:

# 使用shutil.copytree
import shutil
shutil.copytree("comfyui/js", "T:/temp/js")

# 或使用distutils.dir_util.copy_tree
from distutils.dir_util import copy_tree
copy_tree("comfyui/js", "T:/temp/js")

方法2:动态拼接目标路径(适配未知源目录名)

如果源目录名称不确定,可以通过路径处理函数动态拼接目标路径,替代硬编码:

import os
from distutils.dir_util import copy_tree

src_path = os.path.abspath("comfyui/js")
dest_dir = "T:/temp"

if os.path.isdir(src_path):
    # 用os.path.join适配不同系统的路径分隔符
    target_path = os.path.join(dest_dir, os.path.basename(src_path))
    copy_tree(src_path, target_path)

补充说明

你之前的临时解决方案逻辑是正确的,之所以需要判断目录并拼接路径,本质是因为函数本身不负责复制源目录的“外壳”,只负责复制其内部内容。如果需要保留源目录的结构,就必须手动指定目标路径包含该目录名,这是函数设计的正常逻辑,并非需要额外区别处理的特殊情况。

内容的提问来源于stack exchange,提问作者Charlweed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 07:12:11