| 107 | 1 #!/usr/bin/env python | 
|  | 2 | 
|  | 3 """ | 
|  | 4 program illustrating command line in the form of | 
|  | 5 ``--option foo`` or ``--option=foo`` goes to a (key,value) paid | 
|  | 6 and ``-tag`` gets appended to a list.  Further options go to a further list:: | 
|  | 7 | 
|  | 8     >>> main(['-foo', '--bar=fleem', 'baz']) | 
|  | 9     (['foo'], {'bar': 'fleem'}, ['baz']) | 
|  | 10 """ | 
|  | 11 | 
|  | 12 import sys | 
|  | 13 | 
|  | 14 class ParserError(Exception): | 
|  | 15   """error for exceptions while parsing the command line""" | 
|  | 16 | 
|  | 17 def main(_args=sys.argv[1:]): | 
|  | 18 | 
|  | 19   # return values | 
|  | 20   _dict = {} | 
|  | 21   tags = [] | 
|  | 22   args = [] | 
|  | 23 | 
|  | 24   # parse the arguments | 
|  | 25   key = None | 
|  | 26   for arg in _args: | 
|  | 27     if arg.startswith('---'): | 
|  | 28       raise ParserError("arguments should start with '-' or '--' only") | 
|  | 29     elif arg.startswith('--'): | 
|  | 30       if key: | 
|  | 31         raise ParserError("Key %s still open" % key) | 
|  | 32       key = arg[2:] | 
|  | 33       if '=' in key: | 
|  | 34         key, value = key.split('=', 1) | 
|  | 35         _dict[key] = value | 
|  | 36         key = None | 
|  | 37         continue | 
|  | 38     elif arg.startswith('-'): | 
|  | 39       if key: | 
|  | 40         raise ParserError("Key %s still open" % key) | 
|  | 41       tags.append(arg[1:]) | 
|  | 42       continue | 
|  | 43     else: | 
|  | 44       if key: | 
|  | 45         _dict[key] = arg | 
|  | 46         continue | 
|  | 47       args.append(arg) | 
|  | 48 | 
|  | 49   # return values | 
|  | 50   return (_dict, tags, args) | 
|  | 51 | 
|  | 52 if __name__ == '__main__': | 
| 108 | 53   try: | 
|  | 54     _dict, tags, args = main() | 
|  | 55   except ParserError, e: | 
|  | 56     import pdb; pdb.set_trace() # for debugging | 
| 107 | 57   print _dict | 
|  | 58   print tags | 
|  | 59   print args |