【问题标题】:argparse: handle version string like help stringargparse:处理版本字符串,如帮助字符串
【发布时间】:2017-04-24 19:36:08
【问题描述】:

我正在使用 Python 3.6 和 argparse 1.1。

除了-h/--help,我还想要一个选项-v/--version,它会打印一个带有版本信息的字符串并退出程序(就像使用帮助字符串一样)。但是,当我也有位置参数时,执行

$ example --version

结果

usage: example ... 
error: too few arguments

解决方案

我有一个解决方案,我不喜欢它,因为我需要相当多的代码行来做一些 argparse 可以做得更好的事情。

import sys,argparse

class MyParser(argparse.ArgumentParser):
    def format_help(self):
        return 'Help string\n'

def printversion():
    print('0.0.1')
    sys.exit(1)

if len(sys.argv)>1:
    if len(sys.argv[1])>0:
        if sys.argv[1] in ['--version']:
            printversion()

parser = MyParser()
parser.add_argument('argument',nargs=1,type=int)
parser.add_argument('-v','--version',action='store_true')

args = vars(parser.parse_args())

if args['version']: printversion()

【问题讨论】:

  • 不相关,但docopt 比其他任何东西都好。它应该有助于避免愚蠢的错误。 docopt.org
  • @Igor 看起来棒极了!

标签: python argparse


【解决方案1】:

argparse 已经有 a version action 用于此:

'version' - 在 add_argument() 调用中需要一个 version= 关键字参数,并在调用时打印版本信息并退出:

>>> import argparse
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--version', action='version', version='%(prog)s 2.0')
>>> parser.parse_args(['--version'])
PROG 2.0

【讨论】:

  • 太好了,我想我误读/误判了这部分帮助。事实上,我想提供一个多行字符串'hello\nworld'。它似乎忽略了换行符。我可以避免吗?
  • 查看argparse._VersionAction的代码。它使用HelpFormater。因此,使用RawDescriptionHelpFormatterRawTextHelpFormatter 之一可能会保留换行符。
  • bugs.python.org/issue9399 要求一个通用的print 动作,它可以处理更长的文本。 version 是为简单的版本号显示而设计的,现在已经没有广泛使用了。
猜你喜欢
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 2017-10-18
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多