parser example argumentparser arg_parser add_argument python argparse

example - python argparse argumentparser()



Mostrar mensaje de ayuda con python argparse cuando se invoca script sin ningĂșn argumento (11)

Esto podría ser simple. Supongamos que tengo un programa que usa argparse para procesar argumentos / opciones de línea de comando. Lo siguiente imprimirá el mensaje de ''ayuda'':

./myprogram -h

o:

./myprogram --help

Pero, si ejecuto el script sin ningún tipo de argumento, no hace nada. Lo que quiero que haga es mostrar el mensaje de uso cuando se invoca sin argumentos. ¿Cómo se hace eso?


Aquí hay otra forma de hacerlo, si necesita algo flexible donde desea mostrar ayuda si se pasan parámetros específicos, ninguno o más de 1 argumento conflictivo:

import argparse import sys def main(): parser = argparse.ArgumentParser() parser.add_argument(''-d'', ''--days'', required=False, help="Check mapped inventory that is x days old", default=None) parser.add_argument(''-e'', ''--event'', required=False, action="store", dest="event_id", help="Check mapped inventory for a specific event", default=None) parser.add_argument(''-b'', ''--broker'', required=False, action="store", dest="broker_id", help="Check mapped inventory for a broker", default=None) parser.add_argument(''-k'', ''--keyword'', required=False, action="store", dest="event_keyword", help="Check mapped inventory for a specific event keyword", default=None) parser.add_argument(''-p'', ''--product'', required=False, action="store", dest="product_id", help="Check mapped inventory for a specific product", default=None) parser.add_argument(''-m'', ''--metadata'', required=False, action="store", dest="metadata", help="Check mapped inventory for specific metadata, good for debugging past tix", default=None) parser.add_argument(''-u'', ''--update'', required=False, action="store_true", dest="make_updates", help="Update the event for a product if there is a difference, default No", default=False) args = parser.parse_args() days = args.days event_id = args.event_id broker_id = args.broker_id event_keyword = args.event_keyword product_id = args.product_id metadata = args.metadata make_updates = args.make_updates no_change_counter = 0 change_counter = 0 req_arg = bool(days) + bool(event_id) + bool(broker_id) + bool(product_id) + bool(event_keyword) + bool(metadata) if not req_arg: print("Need to specify days, broker id, event id, event keyword or past tickets full metadata") parser.print_help() sys.exit() elif req_arg != 1: print("More than one option specified. Need to specify only one required option") parser.print_help() sys.exit() # Processing logic here ...

¡Aclamaciones!


Con argparse puedes hacer:

parser.argparse.ArgumentParser() #parser.add_args here #sys.argv includes a list of elements starting with the program if len(sys.argv) < 2: parser.print_usage() sys.exit(1)


En lugar de escribir una clase, se puede usar try / except en su lugar

try: options = parser.parse_args() except: parser.print_help() sys.exit(0)

Lo bueno es que el flujo de trabajo es más claro y no necesita una clase de stub. La desventaja es que la primera línea de ''uso'' se imprime dos veces.

Esto necesitará al menos un argumento obligatorio. Sin argumentos obligatorios, proporcionar cero argumentos en la línea de comandos es válido.


Esta respuesta proviene de Steven Bethard en los grupos de Google . Lo vuelvo a publicar aquí para que sea más fácil para las personas sin una cuenta de Google acceder.

Puede anular el comportamiento predeterminado del método de error :

import argparse import sys class MyParser(argparse.ArgumentParser): def error(self, message): sys.stderr.write(''error: %s/n'' % message) self.print_help() sys.exit(2) parser = MyParser() parser.add_argument(''foo'', nargs=''+'') args = parser.parse_args()

Tenga en cuenta que la solución anterior imprimirá el mensaje de ayuda cada vez que se active el método de error . Por ejemplo, test.py --blah también imprimirá el mensaje de ayuda si --blah no es una opción válida.

Si desea imprimir el mensaje de ayuda solo si no se proporcionan argumentos en la línea de comando, entonces quizás esta sea la manera más fácil:

import argparse import sys parser=argparse.ArgumentParser() parser.add_argument(''foo'', nargs=''+'') if len(sys.argv)==1: parser.print_help(sys.stderr) sys.exit(1) args=parser.parse_args()

Tenga en cuenta que parser.print_help() imprime a stdout de forma predeterminada. Como init_js sugiere , use parser.print_help(sys.stderr) para imprimir en stderr.


Establezca sus argumentos posicionales con nargs y compruebe si los argumentos posicionales están vacíos.

import argparse parser = argparse.ArgumentParser() parser.add_argument(''file'', nargs=''?'') args = parser.parse_args() if not args.file: parser.print_help()

Referencia Python nargs


La solución más limpia será pasar manualmente el argumento predeterminado, no se dio ninguno en la línea de comando:

parser.parse_args(args=None if len(sys.argv) > 1 else [''--help''])

Ejemplo completo:

import argparse, sys parser = argparse.ArgumentParser() parser.add_argument(''--host'', default=''localhost'', help=''Host to connect to'') # parse arguments args = parser.parse_args(args=None if len(sys.argv) > 1 else [''--help'']) # use your args print("connecting to {}".format(args.host))

Esto imprimirá ayuda completa (no uso corto) si se llama sin argumentos.


Lanzando mi versión a la pila aquí:

import argparse parser = argparse.ArgumentParser() args = parser.parse_args() if not vars(args): parser.print_help() parser.exit(1)

Puede notar el parser.exit - Principalmente lo hago así porque guarda una línea de importación si esa fue la única razón para sys en el archivo ...


Si asocia funciones predeterminadas para (sub) analizadores, como se menciona en add_subparsers , simplemente puede agregarlo como la acción predeterminada:

parser = argparse.ArgumentParser() parser.set_defaults(func=lambda x: parser.print_usage()) args = parser.parse_args() args.func(args)

Agregue la prueba, excepto si genera excepciones debido a la falta de argumentos posicionales.


Si tiene argumentos que deben especificarse para ejecutar el script, use el parámetro requerido para ArgumentParser como se muestra a continuación:

parser.add_argument(''--foo'', required=True)

parse_args () informará un error si el script se ejecuta sin ningún argumento.


puedes usar optparse

from optparse import OptionParser, make_option parser = OptionParser() parser.add_option(''--var'', help=''put the help of the commandline argument'') (options, args) = parser.parse_args() ./myprogram --help will print all the help messages for each given argument.


parser.print_help() parser.exit()

El método parser.exit también acepta un status (código de retorno) y un valor de message (¡incluye una nueva línea arrastrada por ti mismo!).

un ejemplo obstinado, :)

#!/usr/bin/env python3 """ Example argparser based python file """ import argparse ARGP = argparse.ArgumentParser( description=__doc__, formatter_class=argparse.RawTextHelpFormatter, ) ARGP.add_argument(''--example'', action=''store_true'', help=''Example Argument'') def main(argp=None): if argp is None: argp = ARGP.parse_args() # pragma: no cover if ''soemthing_went_wrong'' and not argp.example: ARGP.print_help() ARGP.exit(status=128, message="/nI just don''t know what went wrong, maybe missing --example condition?/n") if __name__ == ''__main__'': main() # pragma: no cover

Ejemplos de llamadas:

$ python3 ~/helloworld.py; echo $? usage: helloworld.py [-h] [--example] Example argparser based python file optional arguments: -h, --help show this help message and exit --example Example Argument I just don''t know what went wrong, maybe missing --example condition? 128 $ python3 ~/helloworld.py --example; echo $? 0