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

我在Python 2.7中使用argparse来parsinginput选项。 我的一个select是多项select。 我想在帮助文本中列出一个列表,例如

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

但是, argparse所有换行符和连续空格。 结果看起来像

 〜/下载:52 $ python2.7 x.py -h
用法:x.py [-h] [-g {a,b,g,d,e}]

testing

可选参数:
   -h,--help显示此帮助信息并退出
   -g {a,b,g,d,e}某些选项,其中a = alpha b = beta g = gamma d = delta e
                   =ε

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

尝试使用RawTextHelpFormatter

 from argparse import RawTextHelpFormatter parser = ArgumentParser(description='test', formatter_class=RawTextHelpFormatter) 

如果你只是想重写一个选项,你不应该使用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|开头 将被正常包装。

这是我对argparse改进的一部分。 完整的SmartFormatter还支持将默认值添加到所有选项,以及实用程序描述的原始input。 完整版本具有自己的_split_lines方法,因此可以保留对版本string进行的任何格式化:

 parser.add_argument('--version', '-v', action="version", version="version...\n 42!") 

另一个简单的方法就是包含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 ... 

我遇到类似的问题(Python 2.7.6)。 我试图用RawTextHelpFormatter描述部分分成几行:

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

得到:

用法:play-with-argparse.py [选项]

第一段 

                        第二段

                        第三段

可选参数:
   -h,--help显示此帮助信息并退出

所以RawTextHelpFormatter不是一个解决scheme。 因为它打印出现在源代码中的描述,保留所有的空白字符(我想保留额外的标签在我的源代码的可读性,但我不希望将它们全部打印。太长,超过80个字符)。

感谢@Anton启发了正确的方向。 但是为了格式化描述部分,该解决scheme需要稍作修改。

无论如何,自定义格式化程序是必要的。 我扩展现有的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() 

输出是:

用法:play-with-argparse.py [选项]

第一段

第二段

第三段

可选参数:
   -h,--help显示此帮助信息并退出

我希望在描述文本中同时具有手动换行符,并自动换行; 但这里没有任何build议为我工作 – 所以我最终修改了这里的答案给出的SmartFormatter类; 虽然argparse方法名称的问题不是公共API,但是这里是我所拥有的(作为一个名为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() 

这是2.7和3.4的工作原理:

 $ 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