我写了以下代码。
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
的输出应该如何与它所做的所有自动包装一起布局。但我希望版本输出是一个多线输出,新线完好无损。
答案 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""")
它单独留下description
和epilog
,并且仅包装参数帮助字符串。 OP希望相反。