1from __future__ import absolute_import 2class ArgumentProcessor(object): 3 '''This class provides interaction with an RDict object, which by default is shared''' 4 defaultDB = None 5 6 def __init__(self, clArgs = None, argDB = None): 7 '''Setup the argument database''' 8 self.argDB = self.createArgDB(argDB) 9 if clArgs is None: 10 import sys 11 12 self.clArgs = sys.argv[1:] 13 else: 14 self.clArgs = clArgs 15 return 16 17 def __getstate__(self): 18 '''We do not want to pickle the default RDict''' 19 d = self.__dict__.copy() 20 if '_argDB' in d: 21 if d['_argDB'] is ArgumentProcessor.defaultDB: 22 del d['_argDB'] 23 else: 24 d['_argDB'] = None 25 return d 26 27 def __setstate__(self, d): 28 '''We must create the default RDict''' 29 self.__dict__.update(d) 30 if not '_argDB' in d: 31 self.argDB = self.createArgDB(None) 32 return 33 34 def getArgDB(self): 35 return self._argDB 36 def setArgDB(self, argDB): 37 self._argDB = argDB 38 return 39 argDB = property(getArgDB, setArgDB, doc = 'The RDict argument database') 40 41 def createArgDB(self, initDB): 42 '''Create an argument database unless initDB is provided, and insert the command line arguments''' 43 if not initDB is None: 44 argDB = initDB 45 else: 46 if ArgumentProcessor.defaultDB is None: 47 import RDict 48 import os 49 import sys 50 51 # Changed this to assume RDict is independent 52 ArgumentProcessor.defaultDB = RDict.RDict(load = 0, autoShutdown = 0) 53 argDB = ArgumentProcessor.defaultDB 54 return argDB 55 56 def setupArguments(self, argDB): 57 '''Setup types in the argument database 58 - This method should be overridden by any subclass with special arguments, making sure to call the superclass method''' 59 return argDB 60 61 def insertArguments(self, useEnvironment = 0): 62 '''Put arguments in from the command line and environment 63 - This will only insert command line arguments into a given RDict once''' 64 if useEnvironment: 65 import os 66 67 self.argDB.insertArgs(os.environ) 68 if not hasattr(self.argDB, '_setCommandLine'): 69 self.argDB.insertArgs(self.clArgs) 70 self.argDB._setCommandLine = 1 71 return 72 73 def setup(self): 74 '''This method should be overridden for any setup after initialization 75 - Here we determine argument types and insert arguments into the dictionary''' 76 self.setupArguments(self.argDB) 77 self.insertArguments() 78 return 79 80 def cleanup(self): 81 '''This method should be overridden for any cleanup before finalization''' 82 return 83