| """ Utility module handle program args and give help |
| |
| -------------------------------------------------------------------------- |
| File: utilsArgsParse.py |
| |
| Overview: Python module to parse and validate program parameters |
| against those required by the program whether mandatory |
| or optional. |
| Also give help information on arguments required by the |
| program. |
| |
| Gotchas: None. |
| |
| Copyright: None. |
| -------------------------------------------------------------------------- |
| |
| """ |
| |
| # Python modules: |
| import getopt # Parse command line arguments |
| |
| # Third party modules: |
| |
| # In-house modules: |
| |
| # Instantiations: |
| |
| # User facing text: |
| strMsgErrorInvalidParameters = "Invalid parameters entered, -h for help. \nYou entered:\n" |
| strMsgErrorInvalidNoParams = "No parameters entered, -h for help\n" |
| strMsgErrorNumberParameters = "Number of parameters entered incorrect, %d parameters required. You entered:\n" |
| strMsgArgFileNotImplemented = "Sorry the --argFile is not implemented" |
| |
| #++--------------------------------------------------------------------------- |
| # Details: Validate the arguments passed in against the mandatory and |
| # optional arguments specified. The argument format for the parameters |
| # is required to work with the module getopt function getopt(). |
| # Parameter vDictArgReq specifies which parameters are mandatory and |
| # which are optional. The format is for example: |
| # dictArgReq = {"-h": "o", # o = optional, m = mandatory |
| # "-m": "m", |
| # "--targetDir": "m", |
| # "--cfgBldDir": "o" } |
| # Args: vArgv - (R) List of arguments and values. |
| # vstrListArgs - (R) List of small arguments. |
| # vListLongArgs - (R) List of long arguments. |
| # vDictArgReq - (R) Map of arguments required. |
| # vstrHelpInfo - (R) Formatted help text. |
| # Returns: Int - 0 success. |
| # 1 success display information, do nothing else. |
| # -1 error invalid parameters. |
| # -2 error incorrect number of mandatory parameters. |
| # Dict - Map of arguments names to argument values |
| # Str - Error message. |
| # Throws: None. |
| #-- |
| |
| |
| def parse(vArgv, vstrListArgs, vListLongArgs, vDictArgReq, vstrHelpInfo): |
| dictArgs = {} |
| dictDummy = {} |
| strDummy = "" |
| |
| # Validate parameters above and error on not recognised |
| try: |
| dictOptsNeeded, dictArgsLeftOver = getopt.getopt(vArgv, |
| vstrListArgs, |
| vListLongArgs) |
| except getopt.GetoptError: |
| strMsg = strMsgErrorInvalidParameters |
| strMsg += str(vArgv) |
| return (-1, dictDummy, strMsg) |
| |
| if len(dictOptsNeeded) == 0: |
| strMsg = strMsgErrorInvalidNoParams |
| return (-1, dictDummy, strMsg) |
| |
| # Look for help -h before anything else |
| for opt, arg in dictOptsNeeded: |
| if opt == '-h': |
| return (1, dictDummy, vstrHelpInfo) |
| |
| # Look for the --argFile if found ignore other command line arguments |
| for opt, arg in dictOptsNeeded: |
| if opt == '--argsFile': |
| return (1, dictDummy, strMsgArgFileNotImplemented) |
| |
| # Count the number of mandatory args required (if any one found) |
| countMandatory = 0 |
| for opt, man in list(vDictArgReq.items()): |
| if man == "m": |
| countMandatory = countMandatory + 1 |
| |
| # Extract short args |
| listArgs = [] |
| for arg in vstrListArgs: |
| if (arg == '-h') or (arg == ':'): |
| continue |
| listArgs.append(arg) |
| |
| # Append to arg dictionary the option and its value |
| bFoundNoInputValue = False |
| countMandatoryOpts = 0 |
| for opt, val in dictOptsNeeded: |
| match = 0 |
| for arg in listArgs: |
| argg = "-" + arg |
| if opt == argg: |
| if "m" == vDictArgReq[opt]: |
| countMandatoryOpts = countMandatoryOpts + 1 |
| dictArgs[opt] = val |
| match = 1 |
| break |
| if match == 0: |
| for arg in vListLongArgs: |
| argg = "--" + arg.rstrip('=') |
| if opt == argg: |
| if "m" == vDictArgReq[opt]: |
| countMandatoryOpts = countMandatoryOpts + 1 |
| dictArgs[opt] = val |
| if arg[-1:] == '=' and val.__len__() == 0: |
| bFoundNoInputValue = True |
| break |
| |
| # Do any of the long arguments not have a value attached |
| if bFoundNoInputValue: |
| strMsg = strMsgErrorInvalidParameters |
| strMsg += str(vArgv) |
| return (-1, dictDummy, strMsg) |
| |
| # Debug only |
| # print countMandatoryOpts |
| # print countMandatory |
| |
| # Do we have the exact number of mandatory arguments |
| if (countMandatoryOpts > 0) and (countMandatory != countMandatoryOpts): |
| strMsg = strMsgErrorNumberParameters % countMandatory |
| strMsg += str(vArgv) |
| return (-2, dictDummy, strMsg) |
| |
| return (0, dictArgs, strDummy) |