shutil.copytree 报错分析及解决方法
报错现象
在使用 Python 的 shutil 模块进行目录复制时,可能会遇到以下报错:

shutil.copytree(src, dst)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python3.8/shutil.py", line 257, in copytree
os.makedirs(dst, exist_ok=exist_ok)
File "/usr/lib64/python3.8/os.py", line 228, in makedirs
mkdir(name, mode)
FileNotFoundError: [Errno 2] No such file or directory: 'dst' 报错原因
出现上述报错的原因主要有以下几点:
- 目标目录已存在:当使用
shutil.copytree函数时,如果目标目录dst已经存在,则会抛出FileNotFoundError异常。 - 源目录不存在:如果源目录
src不存在,同样会抛出FileNotFoundError异常。 - 文件权限问题:在复制过程中,如果目标目录的父目录没有写权限,则会抛出
PermissionError异常。 - 文件路径错误:如果源目录或目标目录的路径错误,也会导致报错。
解决方法
针对上述原因,以下是解决 shutil.copytree 报错的方法:
检查目标目录是否存在
在调用 shutil.copytree 函数之前,可以先检查目标目录是否存在,如果存在,则先删除目标目录,或者更改目标目录名称。
import os
import shutil
src = "source_directory"
dst = "destination_directory"
if os.path.exists(dst):
shutil.rmtree(dst)
os.makedirs(dst)
else:
os.makedirs(dst)
shutil.copytree(src, dst) 检查源目录是否存在
在调用 shutil.copytree 函数之前,检查源目录是否存在,如果不存在,则抛出异常或提示用户。

if not os.path.exists(src):
raise FileNotFoundError("源目录不存在:{}".format(src)) 检查文件权限
确保目标目录的父目录具有写权限,如果权限不足,则修改权限。
import stat
def set_directory_permissions(path, mode):
stat_info = os.stat(path)
os.chmod(path, stat_info.st_mode | mode)
# 设置目标目录的写权限
set_directory_permissions(dst, stat.S_IWUSR)
# 尝试复制目录
shutil.copytree(src, dst) 检查文件路径
确保源目录和目标目录的路径正确,如果路径错误,则修改路径。
src = "source_directory"
dst = "destination_directory"
if not os.path.isabs(src):
src = os.path.abspath(src)
if not os.path.isabs(dst):
dst = os.path.abspath(dst)
shutil.copytree(src, dst) FAQs
Q1:为什么我在复制目录时遇到 PermissionError 异常?
A1:这通常是因为目标目录的父目录没有写权限,你可以使用 set_directory_permissions 函数来修改权限。

Q2:为什么我在复制目录时遇到 FileNotFoundError 异常?
A2:这可能是由于源目录不存在或目标目录已存在,你可以使用 os.path.exists 函数来检查目录是否存在,并相应地处理异常。

