python shutil.copytree - 忽略权限

7 投票
3 回答
6572 浏览
提问于 2025-04-15 13:44

Python中的shutil.copytree这个功能不是特别灵活;有没有简单的方法可以让它在复制的时候忽略权限设置,而不需要重新写这个功能的代码呢?

否则,copytree在执行时会出现这样的错误:

(…)”[Errno 45] Operation not supported: ‘/path/foo/bar’”

3 个回答

1

在Python 3.2及更高版本中,现在有一种内置的方法可以做到这一点。shutil.copytree可以接受一个自定义的文件复制函数作为参数。你可以用这个功能把默认的文件复制函数(shutil.copy2)换成一个不复制权限的函数,比如shutil.copy

shutil.copytree(src, dst, copy_function=shutil.copy)
5

这个代码不是线程安全的(也就是说在多线程环境下可能会出问题),一般情况下不建议使用,但如果只是写个临时的小脚本,那用它也没关系:

import shutil

_orig_copystat = shutil.copystat
shutil.copystat = lambda x, y: x

shutil.copytree(src, dst)

shutil.copystat = _orig_copystat
3

在你的标准Python安装包里有一个叫做 shutil.py 的文件(在Ubuntu系统上,我的这个文件在 /usr/lib/python2.6 目录下;在Windows上可能是在 C:\Python26\lib 吧?)。里面的copytree函数只有38行代码(如果不算注释的话只有34行),而且文档的最后明确写着:

XXX 把这个示例代码当作参考,而不是最终的工具。

所以,最简单的方法其实就是修改或添加几行代码到copytree,或者找一个其他的库,老实说。

撰写回答