argparse
by default limits the maximum space taken for the option+metavar and will write the help message on a separate line, even if the terminal would be big enough to accomodate both.
Consider this example script:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--name', help='help help')
parser.add_argument('--parameter', help='help help')
parser.add_argument('--parameter-name', help='help help')
parser.add_argument('--this-parameter-name', help='help help')
parser.add_argument('--this-is-parameter-name', help='help help')
parser.add_argument('--this-is-a-parameter-name', help='help help')
parser.add_argument('--this-is-a-long-parameter-name', help='help help')
parser.add_argument('--this-is-a-very-long-parameter-name', help='help help')
parser.add_argument('--this-is-a-very-very-long-parameter-name', help='help help')
parser.add_argument('--this-is-a-very-very-very-long-parameter-name', help='help help')
parser.parse_args()
Results in the following output:
usage: a.py [-h] [--name NAME] [--parameter PARAMETER]
[--parameter-name PARAMETER_NAME]
[--this-parameter-name THIS_PARAMETER_NAME]
[--this-is-parameter-name THIS_IS_PARAMETER_NAME]
[--this-is-a-parameter-name THIS_IS_A_PARAMETER_NAME]
[--this-is-a-long-parameter-name THIS_IS_A_LONG_PARAMETER_NAME]
[--this-is-a-very-long-parameter-name THIS_IS_A_VERY_LONG_PARAMETER_NAME]
[--this-is-a-very-very-long-parameter-name THIS_IS_A_VERY_VERY_LONG_PARAMETER_NAME]
[--this-is-a-very-very-very-long-parameter-name THIS_IS_A_VERY_VERY_VERY_LONG_PARAMETER_NAME]
optional arguments:
-h, --help show this help message and exit
--name NAME help help
--parameter PARAMETER
help help
--parameter-name PARAMETER_NAME
help help
--this-parameter-name THIS_PARAMETER_NAME
help help
--this-is-parameter-name THIS_IS_PARAMETER_NAME
help help
--this-is-a-parameter-name THIS_IS_A_PARAMETER_NAME
help help
--this-is-a-long-parameter-name THIS_IS_A_LONG_PARAMETER_NAME
help help
--this-is-a-very-long-parameter-name THIS_IS_A_VERY_LONG_PARAMETER_NAME
help help
--this-is-a-very-very-long-parameter-name THIS_IS_A_VERY_VERY_LONG_PARAMETER_NAME
help help
--this-is-a-very-very-very-long-parameter-name THIS_IS_A_VERY_VERY_VERY_LONG_PARAMETER_NAME
help help
The simplest way to try to avoid this problem is specifying the metavar
explicitly and use a short value, so instead ov THIS_IS_A_VERY_VERY_VERY_LONG_PARAMETER_NAME
you can use, say, X
. For example:
import argparse
parser = argparse.ArgumentParser()
m = 'X'
parser.add_argument('--name', help='help help', metavar=m)
parser.add_argument('--parameter', help='help help', metavar=m)
parser.add_argument('--parameter-name', help='help help', metavar=m)
parser.add_argument('--this-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-long-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-very-long-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-very-very-long-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-very-very-very-long-parameter-name', help='help help', metavar=m)
parser.parse_args()
Which results in:
usage: a.py [-h] [--name X] [--parameter X] [--parameter-name X]
[--this-parameter-name X] [--this-is-parameter-name X]
[--this-is-a-parameter-name X] [--this-is-a-long-parameter-name X]
[--this-is-a-very-long-parameter-name X]
[--this-is-a-very-very-long-parameter-name X]
[--this-is-a-very-very-very-long-parameter-name X]
optional arguments:
-h, --help show this help message and exit
--name X help help
--parameter X help help
--parameter-name X help help
--this-parameter-name X
help help
--this-is-parameter-name X
help help
--this-is-a-parameter-name X
help help
--this-is-a-long-parameter-name X
help help
--this-is-a-very-long-parameter-name X
help help
--this-is-a-very-very-long-parameter-name X
help help
--this-is-a-very-very-very-long-parameter-name X
help help
this is already way better, but as you can see with very long parameter names it still wont write all the text on one line.
The only way to achieve what you want is to specify a formatter_class
and use the max_help_position
as described in this question. This however is not part of the public API of the module. I have no idea when they did not add at least a couple of useful parameters to the public API.
You still probably want to specify a metavar
:
import argparse
formatter = lambda prog: argparse.HelpFormatter(prog,max_help_position=52)
parser = argparse.ArgumentParser(formatter_class=formatter)
m = 'X'
parser.add_argument('--name', help='help help', metavar=m)
parser.add_argument('--parameter', help='help help', metavar=m)
parser.add_argument('--parameter-name', help='help help', metavar=m)
parser.add_argument('--this-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-long-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-very-long-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-very-very-long-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-very-very-very-long-parameter-name', help='help help', metavar=m)
parser.parse_args()
The output will be:
usage: a.py [-h] [--name X] [--parameter X] [--parameter-name X]
[--this-parameter-name X] [--this-is-parameter-name X]
[--this-is-a-parameter-name X] [--this-is-a-long-parameter-name X]
[--this-is-a-very-long-parameter-name X]
[--this-is-a-very-very-long-parameter-name X]
[--this-is-a-very-very-very-long-parameter-name X]
optional arguments:
-h, --help show this help message and
exit
--name X help help
--parameter X help help
--parameter-name X help help
--this-parameter-name X help help
--this-is-parameter-name X help help
--this-is-a-parameter-name X help help
--this-is-a-long-parameter-name X help help
--this-is-a-very-long-parameter-name X help help
--this-is-a-very-very-long-parameter-name X help help
--this-is-a-very-very-very-long-parameter-name X help help
You could probably try to determine the size of the terminal (most terminals provide a WIDTH
or COLUMNS
env variable that may be useful for that) to decide the value of max_help_position
that would be best in that situation.
To have all the parameters help on one line (assuming big enough terminal) you want:
max_help_position >= max(len(param.name)+len(param.metavar) for param in params)