Spaces:
Running
on
T4
Running
on
T4
| 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: | |
| # We can't just leave it to `copy_function` because legacy | |
| # code with a custom `copy_function` may rely on copytree | |
| # doing the right thing. | |
| os.symlink(linkto, dstname) | |
| else: | |
| # ignore dangling symlink if the flag is on | |
| if not os.path.exists(linkto) and ignore_dangling_symlinks: | |
| continue | |
| # otherwise let the copy occurs. copy2 will raise an error | |
| 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: | |
| # Will raise a SpecialFileError for unsupported file types | |
| copy_function(srcname, dstname) | |
| # catch the Error from the recursive copytree so that we can | |
| # continue with other files | |
| 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) | |
| # continue | |
| if args.local_rank == 0: | |
| src_v = static_dict[k] | |
| assert isinstance(src_v, str) | |
| if src_v.endswith('.zip'): | |
| # copy | |
| 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) | |
| # unzip | |
| 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 | |