我正在尝试使用Python distutils.dir_util.copy_tree
将一个目录的内容复制到另一个目录,并在目标文件已更改的情况下更新它们。我正在使用以下选项:
copy_tree(src, dst, preserve_symlinks=1, update=1)
此方法适用于初始副本,但对所有后续副本均无效:
FileExistsError: [Errno 17] File exists: 'file1' -> 'test2/file2'
其中file1
是指向file2
的符号链接。
我不需要它来更新符号链接。如果它第二次只是忽略它们,或者盲目地覆盖它们,那很好。但是,实际上,在更新模式下复制包含符号链接的目录似乎是不可能的。
是否有某种方法可以使用此工具?有没有更好的工具可以使用,还是需要创建自己的工具?
平台详细信息:
CentOS Linux 7.5 Anaconda Python 3.6.6
答案 0 :(得分:1)
这是我的尝试:distutils.dir_util.copy_tree
的补片,用猴子修补os.symlink
。
import contextlib
import os
import distutils.dir_util
@contextlib.contextmanager
def monkeypatch(object, name, patch):
value_orig = getattr(object, name)
setattr(object, name, patch)
yield object
setattr(object, name, value_orig)
def copy_tree(src, dst, **kwargs):
stdlib_symlink = os.symlink
def _symlink(src, dst, **kwargs):
try:
stdlib_symlink(src, dst, **kwargs)
except FileExistsError as err:
pass
with monkeypatch(distutils.dir_util.os, 'symlink', _symlink):
distutils.dir_util.copy_tree(src, dst, **kwargs)
此版本的_symlink
函数将忽略在符号链接尝试中发生的任何错误。您可以编写自己的代码来重新创建符号链接,例如
def _symlink(src, dst, **kwargs):
try:
stdlib_symlink(src, dst, **kwargs)
except FileExistsError as err:
os.remove(dst)
stdlib_symlink(src, dst)