如何在让 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""")
它单独保留 description
和 epilog
,并且只包装参数帮助字符串。 OP 想要相反的东西。
我写了下面的代码。
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""")
它单独保留 description
和 epilog
,并且只包装参数帮助字符串。 OP 想要相反的东西。