Python 从argparse获取版本字符串
我试图获取在Python 从argparse获取版本字符串,python,python-2.7,argparse,Python,Python 2.7,Argparse,我试图获取在argparse中定义的版本字符串,以便在日志记录中使用。 我使用的典型设置如下: __version__ = "0.1" parser = argparse.ArgumentParser() parser.add_argument('--version', '-V', action='version', version="%(prog)s " + __version__) args = parser.parse_args() 当我打印parser.version()或parser
argparse
中定义的版本字符串,以便在日志记录中使用。
我使用的典型设置如下:
__version__ = "0.1"
parser = argparse.ArgumentParser()
parser.add_argument('--version', '-V', action='version', version="%(prog)s " + __version__)
args = parser.parse_args()
当我打印
parser.version()
或parser.print\u version()
或parser.format\u version()
时,我得到None
。一种解决方案是调用parser.parse_args(['-V'])
,但这也会终止程序的执行。我知道我可以重新创建字符串并将其传递给记录器,但我认为必须有一种方法从argparse
获取此信息。我使用的是python v2.7.5和argparse v1.1。不,一定没有办法从argparse获得它。为什么会有?您可以告诉argparse版本号是什么,而不是反过来。
您不需要“重新创建”字符串。只需创建一次,然后将其传递到argparse
我确信它可以通过argparse上的某些属性获得,但是从那里获取它真的没有意义,需要使用argparse内部构件,这在将来可能会发生变化。没有公共API来获取该信息。已弃用parser.version
属性。您必须找到argparse.\u VersionAction
对象并从那里获取它:
version_action = next((action for action in parser._get_optional_actions()
if isinstance(action, argparse._VersionAction)), None)
print version_action.version if version_action else 'unknown'
这使用了可能更改的私有方法,您得到的只是与您提供给argparse
的字符串完全相同的字符串:
只需将该值存储到其他位置,然后将其传递到
argparse
并直接使用该值,就可以轻松得多。格式版本
(以及使用格式版本
的打印版本
)显示解析器.version
属性,您可以使用版本
参数设置该属性。但正如Martijn所写的那样,这种展示版本的方法是没有说服力的。你会收到一条警告信息
该action='version'
参数采用不同的路径。它有自己的version
参数(但使用parser.version
作为备份)。当由-v
参数字符串触发时,它显示版本信息并调用系统退出
您仍然可以调用-v
,并使用try块避免系统退出:
try:
p.parse_args(['-V'])
except SystemExit:
pass
这对于测试来说很方便,但不是生产中需要的东西。此外,它还捕获了其他出口,如帮助和错误
与任何参数一样,您可以保存操作的链接,并显示、使用甚至修改其属性
version_action = parser.add_argument('--version', '-V', action='version',
version="%(prog)s " + __version__)
print version_action
print version_action.version
assert isinstance(version_action, argparse._VersionAction)
从功能上讲,这与Martijn对解析器的搜索相同。_get_optional_actions()
,但更简单
您可以在不退出系统的情况下,通过以下方式复制\u VersionAction.\uuuu call\uuuu
的操作:
def foo(action, parser):
formatter = parser._get_formatter()
formatter.add_text(action.version)
return formatter.format_help()
foo(version_action, parser)
虽然在本例中,它所做的只是填写%(prog)s
字符串
'为argparse提供'print'操作',讨论添加'print'或'write'操作类型。它的行为与“版本”类似,但没有系统出口,并且可能对格式和打印目的地有更多的控制
def foo(action, parser):
formatter = parser._get_formatter()
formatter.add_text(action.version)
return formatter.format_help()
foo(version_action, parser)