【问题标题】:Multiple lines in python argparse help displaypython argparse帮助显示中的多行
【发布时间】:2015-06-19 05:53:12
【问题描述】:

我正在使用argparse in Python2.7,我想在参数的帮助文本中显示多行。

我的代码如下所示:

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。这个限制系统依赖,有没有办法增加上限?

【问题讨论】:

  • Argparse 在处理基于终端大小的文本重排时故意清除换行符。
  • 我明白了,所以每行字符数的上限是系统相关的。
  • 这不适合我(在 Ubuntu Linux 18.10 上使用 python 3.6.8)。换行符仍然没有出现,都是一个对齐的文本块。
  • 我在那里发现了我的错误:如果使用了子解析器(add_subparsers,后来 add_parser 来定义子解析器),则必须为每个子解析器重新指定 formatter_class

标签: python argparse


【解决方案1】:

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

来自formatter_class section

默认情况下,ArgumentParser 对象将命令行帮助消息中的描述和结语文本换行。

使用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

【讨论】:

  • 如果使用了subparsers(add_subparsers,后面add_parser来定义subparser),每个subparser都要重新指定formatter_class
  • 要添加到 RobertG 的注释中,要设置格式化程序类,您必须首先构造子解析器,然后您可以使用p.formatter_class = argparse.RawDescriptionHelpFormatter 指定格式化程序。
【解决方案2】:

另一种简单的方法是添加 textwrap

例如,

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 ...

【讨论】:

  • dedent 删除换行符
【解决方案3】:

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

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

【讨论】:

  • 这仍然会产生完全相同的字符串值。这是因为帮助格式化程序故意删除了换行符。
猜你喜欢
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 2011-04-07
  • 2016-03-24
  • 2013-09-10
  • 2023-03-23
  • 2016-09-18
相关资源
最近更新 更多