Mueva la “ayuda” a un grupo de argumentos diferente en python argparse

Actualmente estoy creando un progtwig de lectura de directorios usando Python. Estoy usando ‘argparse‘ para analizar los argumentos desde la línea de comandos. Tengo el siguiente código:

parser = argparse.ArgumentParser(prog = "LS.py", usage = "%(prog)s [options] [path1 [path2 [...pathN]]]\nThe paths are optional; if not given . is used.") group = parser.add_argument_group("Options") group.add_argument("-path", default = ".", help = argparse.SUPPRESS, metavar = "") group.add_argument("-m", "--modified", default = False, help = "show last modified date/time [default: off]", metavar = "") group.add_argument("-o ORDER", "--order=ORDER", nargs = 2, default = "name", help = "order by ('name', 'n', 'modified', 'm', 'size', 's')\n[default: name]", metavar = "") group.add_argument("-r", "--recursive", default = False, help = "recurse into subdirectories [default: off]", metavar = "") group.add_argument("-s", "--sizes", default = False, help = "show sizes [default: off]", metavar = "") args = parser.parse_args() return args 

Cuando se llama de la siguiente manera, “LS.py -h” produce el siguiente resultado:

 usage: LS.py [options] [path1 [path2 [...pathN]]] The paths are optional; if not given . is used. optional arguments: -h, --help show this help message and exit Options: -m , --modified show last modified date/time [default: off] -o ORDER , --order=ORDER order by ('name', 'n', 'modified', 'm', 'size', 's') [default: name] -r , --recursive recurse into subdirectories [default: off] -s , --sizes show sizes [default: off] 

Mi pregunta: ¿Hay alguna forma de mover el argumento de ayuda predeterminado a un grupo como Opciones? Además, parece que no puedo encontrar una manera de eliminar el espacio antes de las comas en los argumentos de Opciones. El resultado ideal es:

 Usage: ls.py [options] [path1 [path2 [...pathN]]] The paths are optional; if not given . is used. Options: -h, --help show this help message and exit -m, --modified show last modified date/time [default: off] -o ORDER, --order=ORDER order by ('name', 'n', 'modified', 'm', 'size', 's') [default: name] -r, --recursive recurse into subdirectories [default: off] -s, --sizes show sizes [default: off] 

Puedes usar add_help=False para deshabilitar el comando de ayuda incorporado y agregar el tuyo en su lugar, usando action="help" (¡gracias @mgilson!)

Para deshacerse de los espacios, no establezca metavar en una cadena vacía. Sus opciones deben especificarse usando action="store_true" para que sean verdaderas (sin argumentos) opciones:

 import argparse parser = argparse.ArgumentParser(prog="LS.py", usage="%(prog)s [options] [paths...]\nThe paths are optional; if not given . is used.", add_help=False) group = parser.add_argument_group("Options") group.add_argument("-h", "--help", action="help", help="show this help message and exit") group.add_argument("-path", default=".", help=argparse.SUPPRESS) group.add_argument("-m", "--modified", action="store_true", help="show last modified date/time") group.add_argument("-o", "--order", nargs=1, default="name", help="sort order (n[ame], m[odified], s[ize])\n[default: name]") group.add_argument("-r", "--recursive", action="store_true", help="recurse into subdirectories") group.add_argument("-s", "--sizes", action="store_true", help="show sizes") args = parser.parse_args() 

Salida:

 Options: -h, --help show this help message and exit -m, --modified show last modified date/time -o ORDER, --order ORDER sort order (n[ame], m[odified], s[ize]) [default: name] -r, --recursive recurse into subdirectories -s, --sizes show sizes 

Claro que puedes hacer eso. El truco es simplemente agregar add_help=False el constructor ArgumentParser y luego agregar su propia acción de ayuda al grupo:

 import argparse parser = argparse.ArgumentParser(prog = "LS.py", usage = "%(prog)s [options] [path1 [path2 [...pathN]]]\nThe paths are optional; if not given . is used.", add_help=False) group = parser.add_argument_group("Options") group.add_argument("-path", default = ".", help = argparse.SUPPRESS, metavar = "") group.add_argument("-m", "--modified", default = False, help = "show last modified date/time [default: off]", metavar = "") group.add_argument("-o ORDER", "--order=ORDER", nargs = 2, default = "name", help = "order by ('name', 'n', 'modified', 'm', 'size', 's')\n[default: name]", metavar = "") group.add_argument("-h", "--help", action='help', help='print this fabulous help message') group.add_argument("-r", "--recursive", default = False, help = "recurse into subdirectories [default: off]", metavar = "") group.add_argument("-s", "--sizes", default = False, help = "show sizes [default: off]", metavar = "") args = parser.parse_args() 

Para condensar y simplificar un poco la respuesta anterior de nneonneo , puede tener:

 import argparse parser = argparse.ArgumentParser(prog="LS.py", usage="%(prog)s [options] [paths...]\nThe paths are optional; if not given . is used.", add_help=False) add_arg = parser.add_argument_group("Options").add_argument add_arg("-h", "--help", action="help", help="show this help message and exit") add_arg("-path", default=".", help=argparse.SUPPRESS) add_arg("-m", "--modified", action="store_true", help="show last modified date/time") add_arg("-o", "--order", nargs=1, default="name", help="sort order (n[ame], m[odified], s[ize])\n[default: name]") add_arg("-r", "--recursive", action="store_true", help="recurse into subdirectories") add_arg("-s", "--sizes", action="store_true", help="show sizes") args = parser.parse_args() 

Básicamente, la ligera variación de la respuesta anterior es que no es necesario guardar el group y luego llamar repetidamente al método add_argument .