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