我试图使用Pythondistutils.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版
蟒蛇3.6.6

最佳答案

这是我的尝试:一个带有monkeypatchingdistutils.dir_util.copy_treeos.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)

关于python - 如果存在符号链接(symbolic link),Python distutils copy_tree无法更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53090360/

10-15 01:48