Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Move "help" to a different Argument Group in python argparse

Tags:

Currently I'm creating a directory reader program using Python. I'm using 'argparse' to parse the arguments from command line. I have the following code:

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 

When called in the following manner "LS.py -h" it produces the following output:

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] 

My question: Is there a way to move the default help argument into a group such as Options? Also, I can't seem to find a way to remove the space before the commas in the Options arguments. The ideal output is:

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] 
like image 928
Night Train Avatar asked Oct 25 '12 18:10

Night Train


People also ask

What does Argparse ArgumentParser () do?

ArgumentParser() initializes the parser so that you can start to add custom arguments. To add your arguments, use parser. add_argument() . Some important parameters to note for this method are name , type , and required .

What does Nargs do in Argparse?

Number of Arguments If you want your parameters to accept a list of items you can specify nargs=n for how many arguments to accept. Note, if you set nargs=1 , it will return as a list not a single value.


2 Answers

You can use add_help=False to disable the built-in help command and add your own instead, using action="help" (thanks @mgilson!)

To get rid of the spaces, don't set metavar to an empty string. Your options should be specified using action="store_true" to make them true (argument-less) options:

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() 

Output:

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 
like image 132
nneonneo Avatar answered Sep 20 '22 15:09

nneonneo


Sure you can do that. The trick is to just add add_help=False the the ArgumentParser constructor and then add your own help action to the group:

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() 
like image 22
mgilson Avatar answered Sep 21 '22 15:09

mgilson