come lasciare il messaggio parser aiuto di stampa piuttosto che di errore e di uscita

StackOverflow https://stackoverflow.com/questions/4561580

  •  14-10-2019
  •  | 
  •  

Domanda

Sto usando argparse per gestire args cmd, voglio se non ci sono argomenti specificati, quindi stampare il messaggio di aiuto, ma ora l'uscita parse volontà di un errore, e quindi uscire. il mio codice è:

def main():
    print "in abing/start/main"
    parser = argparse.ArgumentParser(prog="abing")#, usage="%(prog)s <command> [args] [--help]")
    parser.add_argument("-v", "--verbose", action="store_true", default=False, help="show verbose output")

    subparsers = parser.add_subparsers(title="commands")

    bkr_subparser = subparsers.add_parser("beaker", help="beaker inspection")
    bkr_subparser.set_defaults(command=beaker_command)
    bkr_subparser.add_argument("-m", "--max", action="store", default=3, type=int, help="max resubmit count")
    bkr_subparser.add_argument("-g", "--grain", action="store", default="J", choices=["J", "RS", "R", "T", "job", "recipeset", "recipe", "task"], type=str, help="resubmit selection granularity")
    bkr_subparser.add_argument("job_ids", nargs=1, action="store", help="list of job id to be monitored")

    et_subparser = subparsers.add_parser("errata", help="errata inspection")
    et_subparser.set_defaults(command=errata_command)
    et_subparser.add_argument("-w", "--workflows", action="store_true", help="generate workflows for the erratum")
    et_subparser.add_argument("-r", "--run", action="store_true", help="generate workflows, and run for the erratum")
    et_subparser.add_argument("-s", "--start-monitor", action="store_true", help="start monitor the errata system")
    et_subparser.add_argument("-d", "--daemon", action="store_true", help="run monitor into daemon mode")
    et_subparser.add_argument("erratum", action="store", nargs=1, metavar="ERRATUM", help="erratum id")

    if len(sys.argv) == 1:
        parser.print_help()
        return

    args = parser.parse_args()
    args.command(args)

    return

come posso farlo? grazie.

È stato utile?

Soluzione

Una soluzione consiste nel sottoclassi argparse.ArgumentParser e ridefinire il suo metodo error(). Infatti, in caso di errore, ArgumentParser chiama il metodo error(). L'analisi argomento personalizzato può quindi essere effettuata attraverso le sottoclasse invece di argparse.ArgumentParser. Una funzione del modello error() si trova nella sorgente per argparse:

def error(self, message):
    """error(message: string)

    Prints a usage message incorporating the message to stderr and
    exits.

    If you override this in a subclass, it should not return -- it
    should either exit or raise an exception.
    """
    self.print_usage(sys.stderr)
    self.exit(2, '%s: error: %s\n' % (self.prog, message))

E 'per esempio possibile sollevare un'eccezione in error(), invece di stampare un messaggio, in modo che il codice chiamante parse_args() si fa carico dei problemi con i parametri utente.

risposta originale : secondo il chiarimento nei commenti, quanto segue non funziona. Tuttavia, fornisce un meccanismo per l'accesso ai messaggi di aiuto dalle funzioni sub-comando:

È quasi ce l'ha:. In ciascuna delle vostre funzioni *_command(args), è possibile verificare le dimensioni del args e stampare un messaggio di errore se non ci sono abbastanza argomenti

Se si desidera utilizzare l'aiuto generato automaticamente, nelle funzioni di comando, si può ottenere passando le subparsers per ogni comando, in questo modo:

args.command(subparsers, args)  # Instead of args.command(args)

Ogni funzione *_command() dovrebbe quindi semplicemente prendere due argomenti invece di uno. L'aiuto generato automaticamente è attraverso accessibile:

subparsers.choices['beaker'].print_help()  # or print_usage()

per esempio.

Si potrebbe in alternativa scegliere di passare direttamente alla particolare subparser ad ogni *_command() sub-routine di comando:

args.command(subparsers.choices[sys.argv[1]], args)

e poi, in ogni *_command(subparser, args), per stampare la guida con subparser.print_help().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top