如何在让 argparse auto-format/wrap 剩余帮助消息的同时保留 argparse 版本输出中的换行符?

How to preserve newlines in argparse version output while letting argparse auto-format/wrap the remaining help message?

我写了下面的代码。

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 的输出应该如何布局以及它所做的所有自动换行。但我希望版本输出是多行输出,换行符完好无损。

RawTextHelpFormatter 将关闭自动换行,让您的显式 \n 出现。但它会影响所有 help 行。没有办法挑剔。要么接受默认换行,要么在所有帮助行中放置明确的换行符。

您对自己研究 HelpFormatter 代码所需的帮助格式越来越挑剔了。

你最好为此使用自定义 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)

只是不要使用 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()

还有argparse.RawDescriptionHelpFormatter.

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

它单独保留 descriptionepilog,并且只包装参数帮助字符串。 OP 想要相反的东西。