代码之家  ›  专栏  ›  技术社区  ›  kennytm

python argparse:如何在帮助文本中插入换行符?

  •  279
  • kennytm  · 技术社区  · 14 年前

    我在用 argparse in Python 2.7 用于分析输入选项。我的选择之一是多项选择。我想在它的帮助文本中列出一个列表,例如

    from argparse import ArgumentParser
    
    parser = ArgumentParser(description='test')
    
    parser.add_argument('-g', choices=['a', 'b', 'g', 'd', 'e'], default='a',
        help="Some option, where\n"
             " a = alpha\n"
             " b = beta\n"
             " g = gamma\n"
             " d = delta\n"
             " e = epsilon")
    
    parser.parse_args()
    

    然而, 阿格帕斯 删除所有换行符和连续空格。结果看起来像

    ~/Downloads:52$ python2.7 x.py -h
    usage: x.py [-h] [-g {a,b,g,d,e}]
    
    test
    
    optional arguments:
      -h, --help      show this help message and exit
      -g {a,b,g,d,e}  Some option, where a = alpha b = beta g = gamma d = delta e
                      = epsilon
    

    如何在帮助文本中插入换行符?

    5 回复  |  直到 14 年前
        1
  •  323
  •   akhan    6 年前

    试用使用 RawTextHelpFormatter :

    from argparse import RawTextHelpFormatter
    parser = ArgumentParser(description='test', formatter_class=RawTextHelpFormatter)
    
        2
  •  65
  •   Anthon    9 年前

    如果只想覆盖一个选项,则不应使用 RawTextHelpFormatter . 而是将 HelpFormatter 并为应“原始”处理的选项提供一个特别的介绍(我使用 "R|rest of help" ):

    import argparse
    
    class SmartFormatter(argparse.HelpFormatter):
    
        def _split_lines(self, text, width):
            if text.startswith('R|'):
                return text[2:].splitlines()  
            # this is the RawTextHelpFormatter._split_lines
            return argparse.HelpFormatter._split_lines(self, text, width)
    

    并使用它:

    from argparse import ArgumentParser
    
    parser = ArgumentParser(description='test', formatter_class=SmartFormatter)
    
    parser.add_argument('-g', choices=['a', 'b', 'g', 'd', 'e'], default='a',
        help="R|Some option, where\n"
             " a = alpha\n"
             " b = beta\n"
             " g = gamma\n"
             " d = delta\n"
             " e = epsilon")
    
    parser.parse_args()
    

    有其他电话吗 .add_argument() 帮助不是从哪里开始的 R| 将正常包装。

    这是一部分 my improvements on argparse . 完整的SmartFormatter还支持添加 默认为所有选项,以及实用程序说明的原始输入。完整版本 有它自己的 _split_lines 方法,以便保留对版本字符串等所做的任何格式设置:

    parser.add_argument('--version', '-v', action="version",
                        version="version...\n   42!")
    
        3
  •  26
  •   Wang Zong'an    9 年前

    另一个简单的方法是 textwrap .

    例如,

    import argparse, textwrap
    parser = argparse.ArgumentParser(description='some information',
            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 ...
    
        4
  •  11
  •   Community CDub    8 年前

    RawTextHelpFormatter

    parser = ArgumentParser(description="""First paragraph 
    
                                           Second paragraph
    
                                           Third paragraph""",  
                                           usage='%(prog)s [OPTIONS]', 
                                           formatter_class=RawTextHelpFormatter)
    
    options = parser.parse_args()
    

    usage: play-with-argparse.py [OPTIONS]
    
    First paragraph 
    
                            Second paragraph
    
                            Third paragraph
    
    optional arguments:
      -h, --help  show this help message and exit
    

    above

    HelpFormatter _fill_text

    import textwrap as _textwrap
    class MultilineFormatter(argparse.HelpFormatter):
        def _fill_text(self, text, width, indent):
            text = self._whitespace_matcher.sub(' ', text).strip()
            paragraphs = text.split('|n ')
            multiline_text = ''
            for paragraph in paragraphs:
                formatted_paragraph = _textwrap.fill(paragraph, width, initial_indent=indent, subsequent_indent=indent) + '\n\n'
                multiline_text = multiline_text + formatted_paragraph
            return multiline_text
    

    argparse

    def _fill_text(self, text, width, indent):
        text = self._whitespace_matcher.sub(' ', text).strip()
        return _textwrap.fill(text, width, initial_indent=indent,
                                           subsequent_indent=indent)
    

    parser = ArgumentParser(description= """First paragraph 
                                            |n                              
                                            Second paragraph
                                            |n
                                            Third paragraph""",  
                    usage='%(prog)s [OPTIONS]',
                    formatter_class=MultilineFormatter)
    
    options = parser.parse_args()
    

    usage: play-with-argparse.py [OPTIONS]
    
    First paragraph
    
    Second paragraph
    
    Third paragraph
    
    optional arguments:
      -h, --help  show this help message and exit
    
        5
  •  2
  •   sdbbs    8 年前

    test.py

    import argparse
    from argparse import RawDescriptionHelpFormatter
    
    # call with: python test.py -h
    
    class SmartDescriptionFormatter(argparse.RawDescriptionHelpFormatter):
      #def _split_lines(self, text, width): # RawTextHelpFormatter, although function name might change depending on Python
      def _fill_text(self, text, width, indent): # RawDescriptionHelpFormatter, although function name might change depending on Python
        #print("splot",text)
        if text.startswith('R|'):
          paragraphs = text[2:].splitlines()
          rebroken = [argparse._textwrap.wrap(tpar, width) for tpar in paragraphs]
          #print(rebroken)
          rebrokenstr = []
          for tlinearr in rebroken:
            if (len(tlinearr) == 0):
              rebrokenstr.append("")
            else:
              for tlinepiece in tlinearr:
                rebrokenstr.append(tlinepiece)
          #print(rebrokenstr)
          return '\n'.join(rebrokenstr) #(argparse._textwrap.wrap(text[2:], width))
        # this is the RawTextHelpFormatter._split_lines
        #return argparse.HelpFormatter._split_lines(self, text, width)
        return argparse.RawDescriptionHelpFormatter._fill_text(self, text, width, indent)
    
    parser = argparse.ArgumentParser(formatter_class=SmartDescriptionFormatter, description="""R|Blahbla bla blah blahh/blahbla (bla blah-blabla) a blahblah bl a blaha-blah .blah blah
    
    Blah blah bla blahblah, bla blahblah blah blah bl blblah bl blahb; blah bl blah bl bl a blah, bla blahb bl:
    
      blah blahblah blah bl blah blahblah""")
    
    options = parser.parse_args()
    

    $ python test.py -h
    usage: test.py [-h]
    
    Blahbla bla blah blahh/blahbla (bla blah-blabla) a blahblah bl a blaha-blah
    .blah blah
    
    Blah blah bla blahblah, bla blahblah blah blah bl blblah bl blahb; blah bl
    blah bl bl a blah, bla blahb bl:
    
      blah blahblah blah bl blah blahblah
    
    optional arguments:
      -h, --help  show this help message and exit