import sys
class Exists(Exception):
def __init__(self, msg, opt=''):
super(Exists, self).__init__(msg, opt)
self.msg = msg
def __str__(self):
return self.msg
class SysArgs(object):
def __init__(self):
self.__par_name = []
self.__required = []
self.__long_options = {}
self.__help_dict = {}
self.__func_dict = {}
self.__long_short = {}
self.__args = {}
self.__parameter_list = []
self.add_par('H', 'helper', helper='Get helper')
self.add_par('h', 'helper', helper='Get helper')
def add_par(self, options: str, long_options: str = None, helper: str = None, func=None, required: bool = False,
parameter: bool = False, **args):
if options in self.__par_name:
raise Exists('%s is exists' % options)
if helper:
self.__help_dict[options] = helper
if func:
self.__func_dict[options] = func
if required:
self.__required.append(options)
if long_options:
self.__long_short[long_options] = options
self.__long_options[options] = long_options
if parameter:
self.__parameter_list.append(options)
self.__par_name.append(options)
else:
self.__par_name.append(options)
if args:
self.__args[options] = args
def args(self):
self.opt = self.getopt()
for name, value in self.opt:
if name == '-h' or name == '-H' or name == '--helper':
self.__helper()
continue
name = name[1:]
if name.startswith('-'):
name = name[1:]
self.__dict__[name] = value
name = self.__long_short[name]
if name in self.__long_options:
self.__dict__[self.__long_options[name]] = value
self.__dict__[name] = value
self.__func()
def __throw_error(self, par):
print('error: %s' % par)
exit()
def __helper(self):
print(f'{"briefness":<15}{"complete":<20}{"describe"}', end='\n\n')
for name in self.__par_name:
if name == ':' or name == 'H':
continue
long_options = ''
if name in self.__long_options:
long_options = '--' + self.__long_options[name]
if name == 'h':
print(f'-{name.lower() + " " + name.upper():<9}{long_options:<20}{self.__help_dict[name]}')
continue
if name in self.__help_dict:
print(f'{"-" + name:<10}{long_options:<20}{self.__help_dict[name]}')
continue
print(f'{"-" + name:<10}{long_options}')
exit()
def __func(self):
for name, value in self.opt:
name = self.__swap(name)
if name in self.__func_dict and name in self.__args:
self.__func_dict[name](*self.__args[name]['args'])
elif name in self.__parameter_list and name in self.__dict__ and self.__dict__[name]:
self.__func_dict[name](*self.__dict__[name])
else:
self.__func_dict[name]()
def getopt(self):
parameters = sys.argv[1:]
_args = []
_is = []
seed = 0
for element in parameters:
if element.startswith('-') or element.startswith('--'):
seed += 1
_is.append(element)
_args.append((element, []))
par = element
par = self.__swap(par)
if par not in self.__par_name:
self.__throw_error('Parameter %s is not recognized' % element)
continue
_args[seed - 1][1].append(element)
for par, vales in _args:
arg = par
par = self.__swap(par)
if par in self.__parameter_list and not vales:
self.__throw_error(' %s option missing parameters' % arg)
for required in self.__required:
if required not in _is:
self.__throw_error('%s Can not be omitted' % required)
return _args
def __swap(self, par):
par = par[1:]
if par.startswith('-') and par[1:] in self.__long_short:
par = self.__long_short[par[1:]]
return par
示列:
def main(par):
print(par)
if __name__ == '__main__':
sys = SysArgs()
sys.add_par('t', func=main, parameter=True, helper="测试")
sys.args()
终端:
$ python3 test.py -t HELLO
HELLO # 输出
获取终端值
from sysArgs import SysArgs
def main():
print(sys.t)
if __name__ == '__main__':
sys = SysArgs()
sys.add_par('t', helper="测试")
sys.args()
终端:
$ python3 test.py -t HELLO WORLD
['HELLO', 'WORLD'] # 输出