Mostrar mensaje de ayuda con Python argparse cuando se llama al script sin ningún argumento
Supongamos que tengo un programa que se utiliza 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 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?
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 error
mé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 --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, 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.
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.
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.
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
ArgumentParser
debe invocar en la línea de comando. Sifile
es asíNone
,sys.stdout
se supone.