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