如何在argparse自动格式化/包装剩余的帮助消息的同时保留argparse版本输出中的换行符?

时间:2016-03-08 02:05:15

标签: python python-3.x argparse

我写了以下代码。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-v', '--version', action='version',
                    version='%(prog)s 1.0\nCopyright (c) 2016 Lone Learner')
parser.parse_args()

这会产生以下输出。

$ python foo.py --version
foo.py 1.0 Copyright (c) 2016 Lone Learner

您可以看到换行符丢失。我希望版权声明出现在下一行。

如何在版本输出消息中保留新行?

我仍然希望argparse能够计算出python foo.py -h的输出应该如何与它所做的所有自动包装一起布局。但我希望版本输出是一个多线输出,新线完好无损。

4 个答案:

答案 0 :(得分:2)

RawTextHelpFormatter将关闭自动换行,允许您显式\n。但它会影响所有help行。没有办法挑选和选择。接受默认包装,或在所有帮助行中添加显式换行符。

您对自己研究HelpFormatter代码所需的帮助格式有了一定程度的挑剔。

答案 1 :(得分:1)

为此,您最好使用自定义argparse.Action

import argparse
import os
import sys

class MultilineVersionAction(argparse.Action):
    verbose_version = '1.0\nCopyright (c) 2016 Lone Learner'

    def __init__(self, option_strings, dest, nargs=None, **kwargs):
        if nargs is not None:
            raise ValueError('nargs not allowed')
        # this is how argparse initialises `prog` by default
        self.prog = os.path.basename(sys.argv[0])
        super(MultilineVersionAction, self).__init__(option_strings, dest, nargs=0, **kwargs)

    def __call__(self, parser, namespace, values, option_string=None):
        parser.exit(message='{} {}\n'.format(self.prog, self.verbose_version))

# ...

    self.parser.add_argument('-v', '--version', action=MultilineVersionAction)

答案 2 :(得分:0)

请勿使用action='version'-h可以重复相同的模式。

import os
import sys
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-v', '--version', action='store_true')
args = parser.parse_args()

if args.version:
    prog = os.path.basename(__file__)
    print('{} 1.0\nCopyright (c) 2016 Lone Learner'.format(prog))
    sys.exit()

答案 3 :(得分:0)

还有argparse.RawDescriptionHelpFormatter

parser=argparse.ArgumentParser(add_help=True,
    formatter_class=argparse.RawDescriptionHelpFormatter,
    description="""an
already-wrapped
description
string""")

它单独留下descriptionepilog,并且仅包装参数帮助字符串。 OP希望相反。