Mostrar mensaje de ayuda con Python argparse cuando se llama al script sin ningún argumento

Resuelto musashiXXX asked hace 14 años • 18 respuestas

Supongamos que tengo un programa que se utiliza argparsepara 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 argumento, no hace nada. Lo que quiero que haga es mostrar el mensaje de uso cuando se llama sin argumentos. ¿Cómo se hace eso?

musashiXXX avatar Oct 28 '10 18:10 musashiXXX
Aceptado

Esta respuesta proviene de Steven Bethard en los grupos de Google . Lo volveré a publicar aquí para facilitar el acceso a las personas sin una cuenta de Google.

Puede anular el comportamiento predeterminado del errormétodo:

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 error se active el método. Por ejemplo, test.py --blahtambién imprimirá el mensaje de ayuda si --blahno 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, quizás esta sea la forma más sencilla:

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 en la salida estándar de forma predeterminada. Como sugiere init_js , utilícelo parser.print_help(sys.stderr)para imprimir en stderr.

unutbu avatar Oct 28 '2010 12:10 unutbu

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

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

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

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

vacri avatar Mar 27 '2015 04:03 vacri

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

parser.parse_args(args=None if 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 sys.argv[1:] else ['--help'])

# use your args
print("connecting to {}".format(args.host))

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

Ievgen Popovych avatar Nov 22 '2017 16:11 Ievgen Popovych

Con argparse podrías usar ArgumentParser.print_usage():

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)

Ayuda para imprimir

ArgumentParser.print_usage(file=None)

  Imprima una breve descripción de cómo se ArgumentParserdebe invocar en la línea de comando. Si filees así None, sys.stdoutse supone.

cgseller avatar Mar 28 '2015 01:03 cgseller