gpt4 book ai didi

如果有符号链接(symbolic link),Python distutils copy_tree 无法更新

转载 作者:行者123 更新时间:2023-11-28 18:06:41 26 4
gpt4 key购买 nike

我正在尝试使用 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 的符号链接(symbolic link)。

我不需要它来更新符号链接(symbolic link)。如果它第二次忽略它们,或者盲目地覆盖它们,那也没关系。但是,实际上,似乎不可能在更新模式下复制包含符号链接(symbolic link)的目录。

有什么方法可以使用这个工具来做到这一点吗?是否有更好的工具可供使用,还是我需要创建自己的工具?

平台详情:

CentOS Linux 7.5 python Python 3.6.6

最佳答案

这是我的尝试:distutils.dir_util.copy_tree 的垫片使用 monkeypatching 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 函数将忽略符号链接(symbolic link)尝试中发生的任何错误。您可以编写自己的代码来重新创建符号链接(symbolic link),例如

def _symlink(src, dst, **kwargs):
try:
stdlib_symlink(src, dst, **kwargs)
except FileExistsError as err:
os.remove(dst)
stdlib_symlink(src, dst)

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com