1
+ '''
2
+ Function:
3
+ Implementation of ConfigParser
4
+ Author:
5
+ Zhenchao
6
+ '''
7
+ import os
8
+ import sys
9
+ import importlib
10
+ import importlib .util
11
+ import dill as pickle
12
+ from .io import touchdir
13
+
14
+
15
+ '''ConfigParser'''
16
+ class ConfigParser ():
17
+ def __init__ (self , library_name = 'csseg' ):
18
+ self .library_name = library_name
19
+ '''parsefrompy'''
20
+ def parsefrompy (self , cfg_file_path ):
21
+ # assert
22
+ assert cfg_file_path .endswith ('.py' )
23
+ # obtain module path
24
+ module_path = cfg_file_path [len (os .getcwd ()):].replace ('\\ ' , '/' )
25
+ module_path = module_path .replace ('/' , '.' )
26
+ module_path = module_path .strip ('.' )[:- 3 ]
27
+ # load cfg
28
+ spec = importlib .util .spec_from_file_location (module_path , cfg_file_path )
29
+ cfg = importlib .util .module_from_spec (spec )
30
+ sys .modules [module_path ] = cfg
31
+ spec .loader .exec_module (cfg )
32
+ # return cfg
33
+ return cfg , cfg_file_path
34
+ '''parsefrompkl'''
35
+ def parsefrompkl (self , cfg_file_path ):
36
+ cfg = pickle .load (open (cfg_file_path , 'rb' ))
37
+ return cfg , cfg_file_path
38
+ '''parse'''
39
+ def parse (self , cfg_file_path ):
40
+ # ext to parse method
41
+ ext_to_parse_method = {
42
+ '.py' : self .parsefrompy , '.pkl' : self .parsefrompkl ,
43
+ }
44
+ # config ext
45
+ cfg_ext = os .path .splitext (cfg_file_path )[- 1 ]
46
+ # assert
47
+ assert cfg_ext in ext_to_parse_method , f'unable to parse config with extension { cfg_ext } '
48
+ # parse
49
+ return ext_to_parse_method [cfg_ext ](cfg_file_path = cfg_file_path )
50
+ '''save'''
51
+ def save (self , work_dir = '' ):
52
+ work_dir = os .path .join (work_dir , 'configs' )
53
+ touchdir (work_dir )
54
+ savepath = os .path .join (work_dir , os .path .basename (self .cfg_file_path ) + '.pkl' )
55
+ return pickle .dump (self .cfg , open (savepath , 'wb' ))
56
+ '''call'''
57
+ def __call__ (self , cfg_file_path ):
58
+ cfg_file_path = os .path .abspath (os .path .expanduser (cfg_file_path ))
59
+ self .cfg , self .cfg_file_path = self .parse (cfg_file_path = cfg_file_path )
60
+ return self .cfg , self .cfg_file_path
0 commit comments