python argparse帮助显示中的多行

python argparse帮助显示中的多行,python,argparse,Python,Argparse,我正在使用并且希望在参数的帮助文本中显示多行 我的代码如下所示: import argparse parser = argparse.ArgumentParser(description='details', usage='use "%(prog)s --help" for more information') parser.add_argument('--argument', default=None, type=sometype, help='''

我正在使用并且希望在参数的帮助文本中显示多行

我的代码如下所示:

import argparse

parser = argparse.ArgumentParser(description='details',
        usage='use "%(prog)s --help" for more information')

parser.add_argument('--argument', default=None, type=sometype,
        help='''
             First line  \n
             Second line \n
             \n
             More lines  \n
             ''')
我想在调用--help时将帮助消息打印成多行。但是,输出如下所示

First line Second line More lines
我知道我可以通过把每行的字符串相加来解决这个问题

parser.add_argument('--argument', default=None, type=sometype,
        help='First line  \n' +
             'Second line \n' +
             '\n'             + 
             'More lines')
但是有几十行我想添加到帮助文本中。我想知道是否有一种方便的方法将帮助文本拆分为多行


而且,在帮助消息的一行中显示的字符数似乎有一个上限,在我的例子中是54。此限制系统是否依赖于此?是否有办法增加上限?

您可以做的最简单的事情是将这些行放置在一个数组中,然后用换行符将它们连接起来,如下所示:

help_lines = ['First line', 'Second line', '', 'More lines']
# ...
parser.add_argument('--argument', default=None, type=sometype,
help='\n'.join(help_lines))

默认的帮助格式化程序重新包装行以适合您的终端(它查看
COLUMNS
环境变量以确定输出宽度,默认为总共80个字符)

从:

默认情况下,
ArgumentParser
objects行在命令行帮助消息中包装描述和结束语文本

改为使用
RawTextHelpFormatter
类指示您已包装行:

RawTextHelpFormatter为各种帮助文本维护空白,包括参数描述

对于您的代码,如下所示:

parser = argparse.ArgumentParser(description='details',
        usage='use "%(prog)s --help" for more information',
        formatter_class=argparse.RawTextHelpFormatter)
注意不要添加太多新行;三重引号字符串包括您在字符串中留下的换行符。因此,您不需要
\n
字符:

>>> import argparse
>>> parser = argparse.ArgumentParser(description='details',
...         usage='use "%(prog)s --help" for more information',
...         formatter_class=argparse.RawTextHelpFormatter)
>>> parser.add_argument('--argument', default=None,
...         help='''
...              First line
...              Second line
... 
...              More lines
...              ''')
_StoreAction(option_strings=['--argument'], dest='argument', nargs=None, const=None, default=None, type=None, choices=None, help='\n             First line\n             Second line\n\n             More lines\n             ', metavar=None)
>>> parser.print_help()
usage: use " --help" for more information

details

optional arguments:
  -h, --help           show this help message and exit
  --argument ARGUMENT  
                                    First line
                                    Second line

                                    More lines

另一个简单的方法是包含

比如说,

import argparse, textwrap
parser = argparse.ArgumentParser(description='Prepare input file',
        usage='use "python %(prog)s --help" for more information',
        formatter_class=argparse.RawTextHelpFormatter)

parser.add_argument('--argument', default=somedefault, type=sometype,
        help= textwrap.dedent('''\
        First line
        Second line
        More lines ...
         '''))
这样,我们可以避免每个输出行前面的长空空间

usage: use "python your_python_program.py --help" for more information

Prepare input file

optional arguments:
-h, --help            show this help message and exit
--argument ARGUMENT
                      First line
                      Second line
                      More lines ...

Argparse故意清除换行符,因为它处理基于终端大小的文本回流。我明白了,所以每行字符数的上限取决于系统。我不知道这可能是重复的(在Ubuntu Linux 18.10上使用python 3.6.8)。换行符仍然没有出现,这都是一个对齐的文本块。我在那里发现了我的错误:如果使用子parser(添加子parser,稍后添加解析器来定义子parser),则必须为每个子parser重新指定formatter类。这仍然会产生完全相同的字符串值。这是因为帮助格式化程序故意删除了换行符。如果使用了子parser(添加\u子parser,稍后添加\u解析器来定义子parser),则必须为每个子ParserDedent删除换行符重新指定格式化程序\u类