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