Spaces:
Sleeping
Sleeping
Download Flexpert-Design/src/tools/config_utils.py from Honzus24/flexpert: direct link, hf CLI and curl.
- Browser
- Download file 3.98 kB
-
https://huggingface.co/spaces/Honzus24/flexpert/resolve/main/Flexpert-Design/src/tools/config_utils.py
- Command line
-
hf download hf://spaces/Honzus24/flexpert/Flexpert-Design/src/tools/config_utils.py
-
curl -L -o config_utils.py https://huggingface.co/spaces/Honzus24/flexpert/resolve/main/Flexpert-Design/src/tools/config_utils.py
3.98 kB
| import os.path as osp | |
| import tempfile | |
| import re | |
| import shutil | |
| import sys | |
| import ast | |
| from importlib import import_module | |
| ''' | |
| Thanks the code from https://github.com/open-mmlab/mmcv/blob/master/mmcv/utils/config.py wrote by Open-MMLab. | |
| The `Config` class here uses some parts of this reference. | |
| ''' | |
| def check_file_exist(filename, msg_tmpl='file "{}" does not exist'): | |
| if not osp.isfile(filename): | |
| raise FileNotFoundError(msg_tmpl.format(filename)) | |
| class Config: | |
| def __init__(self, cfg_dict=None, filename=None): | |
| if cfg_dict is None: | |
| cfg_dict = dict() | |
| elif not isinstance(cfg_dict, dict): | |
| raise TypeError('cfg_dict must be a dict, but ' | |
| f'got {type(cfg_dict)}') | |
| if filename is not None: | |
| cfg_dict = self._file2dict(filename, True) | |
| filename = filename | |
| super(Config, self).__setattr__('_cfg_dict', cfg_dict) | |
| super(Config, self).__setattr__('_filename', filename) | |
| def _validate_py_syntax(filename): | |
| with open(filename, 'r') as f: | |
| content = f.read() | |
| try: | |
| ast.parse(content) | |
| except SyntaxError as e: | |
| raise SyntaxError('There are syntax errors in config ' | |
| f'file {filename}: {e}') | |
| def _substitute_predefined_vars(filename, temp_config_name): | |
| file_dirname = osp.dirname(filename) | |
| file_basename = osp.basename(filename) | |
| file_basename_no_extension = osp.splitext(file_basename)[0] | |
| file_extname = osp.splitext(filename)[1] | |
| support_templates = dict( | |
| fileDirname=file_dirname, | |
| fileBasename=file_basename, | |
| fileBasenameNoExtension=file_basename_no_extension, | |
| fileExtname=file_extname) | |
| with open(filename, 'r') as f: | |
| config_file = f.read() | |
| for key, value in support_templates.items(): | |
| regexp = r'\{\{\s*' + str(key) + r'\s*\}\}' | |
| value = value.replace('\\', '/') | |
| config_file = re.sub(regexp, value, config_file) | |
| with open(temp_config_name, 'w') as tmp_config_file: | |
| tmp_config_file.write(config_file) | |
| def _file2dict(filename, use_predefined_variables=True): | |
| filename = osp.abspath(osp.expanduser(filename)) | |
| check_file_exist(filename) | |
| fileExtname = osp.splitext(filename)[1] | |
| if fileExtname not in ['.py']: | |
| raise IOError('Only py type are supported now!') | |
| with tempfile.TemporaryDirectory() as temp_config_dir: | |
| temp_config_file = tempfile.NamedTemporaryFile( | |
| dir=temp_config_dir, suffix=fileExtname) | |
| temp_config_name = osp.basename(temp_config_file.name) | |
| # Substitute predefined variables | |
| if use_predefined_variables: | |
| Config._substitute_predefined_vars(filename, | |
| temp_config_file.name) | |
| else: | |
| shutil.copyfile(filename, temp_config_file.name) | |
| if filename.endswith('.py'): | |
| temp_module_name = osp.splitext(temp_config_name)[0] | |
| sys.path.insert(0, temp_config_dir) | |
| Config._validate_py_syntax(filename) | |
| mod = import_module(temp_module_name) | |
| sys.path.pop(0) | |
| cfg_dict = { | |
| name: value | |
| for name, value in mod.__dict__.items() | |
| if not name.startswith('__') | |
| } | |
| # delete imported module | |
| del sys.modules[temp_module_name] | |
| # close temp file | |
| temp_config_file.close() | |
| return cfg_dict | |
| def fromfile(filename, use_predefined_variables=True): | |
| cfg_dict = Config._file2dict(filename, use_predefined_variables) | |
| return Config(cfg_dict, filename=filename) | |