| import os |
| import os.path as osp |
| import shutil |
| import time |
| import datetime |
|
|
| import torch |
|
|
| from util.slconfig import SLConfig |
|
|
| class Error(OSError): |
| pass |
|
|
| def slcopytree(src, dst, symlinks=False, ignore=None, copy_function=shutil.copyfile, |
| ignore_dangling_symlinks=False): |
| """ |
| modified from shutil.copytree without copystat. |
| |
| Recursively copy a directory tree. |
| |
| The destination directory must not already exist. |
| If exception(s) occur, an Error is raised with a list of reasons. |
| |
| If the optional symlinks flag is true, symbolic links in the |
| source tree result in symbolic links in the destination tree; if |
| it is false, the contents of the files pointed to by symbolic |
| links are copied. If the file pointed by the symlink doesn't |
| exist, an exception will be added in the list of errors raised in |
| an Error exception at the end of the copy process. |
| |
| You can set the optional ignore_dangling_symlinks flag to true if you |
| want to silence this exception. Notice that this has no effect on |
| platforms that don't support os.symlink. |
| |
| The optional ignore argument is a callable. If given, it |
| is called with the `src` parameter, which is the directory |
| being visited by copytree(), and `names` which is the list of |
| `src` contents, as returned by os.listdir(): |
| |
| callable(src, names) -> ignored_names |
| |
| Since copytree() is called recursively, the callable will be |
| called once for each directory that is copied. It returns a |
| list of names relative to the `src` directory that should |
| not be copied. |
| |
| The optional copy_function argument is a callable that will be used |
| to copy each file. It will be called with the source path and the |
| destination path as arguments. By default, copy2() is used, but any |
| function that supports the same signature (like copy()) can be used. |
| |
| """ |
| errors = [] |
| if os.path.isdir(src): |
| names = os.listdir(src) |
| if ignore is not None: |
| ignored_names = ignore(src, names) |
| else: |
| ignored_names = set() |
|
|
| os.makedirs(dst) |
| for name in names: |
| if name in ignored_names: |
| continue |
| srcname = os.path.join(src, name) |
| dstname = os.path.join(dst, name) |
| try: |
| if os.path.islink(srcname): |
| linkto = os.readlink(srcname) |
| if symlinks: |
| |
| |
| |
| os.symlink(linkto, dstname) |
| else: |
| |
| if not os.path.exists(linkto) and ignore_dangling_symlinks: |
| continue |
| |
| if os.path.isdir(srcname): |
| slcopytree(srcname, dstname, symlinks, ignore, |
| copy_function) |
| else: |
| copy_function(srcname, dstname) |
| elif os.path.isdir(srcname): |
| slcopytree(srcname, dstname, symlinks, ignore, copy_function) |
| else: |
| |
| copy_function(srcname, dstname) |
| |
| |
| except Error as err: |
| errors.extend(err.args[0]) |
| except OSError as why: |
| errors.append((srcname, dstname, str(why))) |
| else: |
| copy_function(src, dst) |
|
|
| if errors: |
| raise Error(errors) |
| return dst |
|
|
| def check_and_copy(src_path, tgt_path): |
| if os.path.exists(tgt_path): |
| return None |
|
|
| return slcopytree(src_path, tgt_path) |
|
|
|
|
| def remove(srcpath): |
| if os.path.isdir(srcpath): |
| return shutil.rmtree(srcpath) |
| else: |
| return os.remove(srcpath) |
|
|
|
|
| def preparing_dataset(pathdict, image_set, args): |
| start_time = time.time() |
| dataset_file = args.dataset_file |
| data_static_info = SLConfig.fromfile('util/static_data_path.py') |
| static_dict = data_static_info[dataset_file][image_set] |
|
|
| copyfilelist = [] |
| for k,tgt_v in pathdict.items(): |
| if os.path.exists(tgt_v): |
| if args.local_rank == 0: |
| print("path <{}> exist. remove it!".format(tgt_v)) |
| remove(tgt_v) |
| |
| |
| if args.local_rank == 0: |
| src_v = static_dict[k] |
| assert isinstance(src_v, str) |
| if src_v.endswith('.zip'): |
| |
| cp_tgt_dir = os.path.dirname(tgt_v) |
| filename = os.path.basename(src_v) |
| cp_tgt_path = os.path.join(cp_tgt_dir, filename) |
| print('Copy from <{}> to <{}>.'.format(src_v, cp_tgt_path)) |
| os.makedirs(cp_tgt_dir, exist_ok=True) |
| check_and_copy(src_v, cp_tgt_path) |
|
|
| |
| import zipfile |
| print("Starting unzip <{}>".format(cp_tgt_path)) |
| with zipfile.ZipFile(cp_tgt_path, 'r') as zip_ref: |
| zip_ref.extractall(os.path.dirname(cp_tgt_path)) |
|
|
| copyfilelist.append(cp_tgt_path) |
| copyfilelist.append(tgt_v) |
| else: |
| print('Copy from <{}> to <{}>.'.format(src_v, tgt_v)) |
| os.makedirs(os.path.dirname(tgt_v), exist_ok=True) |
| check_and_copy(src_v, tgt_v) |
| copyfilelist.append(tgt_v) |
| |
| if len(copyfilelist) == 0: |
| copyfilelist = None |
| args.copyfilelist = copyfilelist |
| |
| if args.distributed: |
| torch.distributed.barrier() |
| total_time = time.time() - start_time |
| if copyfilelist: |
| total_time_str = str(datetime.timedelta(seconds=int(total_time))) |
| print('Data copy time {}'.format(total_time_str)) |
| return copyfilelist |
|
|
|
|
| |