Вот моя попытка: прокладка для 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)