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

2024-10-01 02:34:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了下面的代码。在

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

这将产生以下输出。在

^{pr2}$

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

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

我仍然希望argparse计算出python foo.py -h的输出应该如何进行自动包装。但是我希望版本输出是一个多行输出,换行符保持不变。在


Tags: 代码import版本addparserparseversionargparse
3条回答

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

还有^{}

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

它不使用descriptionepilog,只包装参数帮助字符串。手术室想要的恰恰相反。

RawTextHelpFormatter将关闭自动包装,允许显式的\n出现。但它会影响所有help行。没有挑选的方法。要么接受默认包装,要么在所有帮助行中添加显式换行符。

对于帮助格式,您已经到了一个挑剔的程度,您需要亲自研究HelpFormatter代码。

相关问题 更多 >