2014-11-05 53 views
0

我试图找回我在​​中定义的版本字符串以用于日志记录。 我使用的线沿线的一个典型设置:从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_version()parser.format_version()我得到None。一种解决方案是调用parser.parse_args(['-V']),但这也会终止程序的执行。我知道我可以重新创建字符串并将其传递给记录器,但我认为必须有一种方法可以从​​中获取该字符串。我正在使用python v2.7.5和argparse v1.1。

回答

0

没有public获取该信息的API。 parser.version属性已弃用。你必须找到argparse._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' 

它使用私有的方法是有可能发生变化,而你得到的是你给​​的完全相同的字符串:

>>> import argparse 
>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('--version', '-V', action='version', version="%(prog)s " + __version__) 
_VersionAction(option_strings=['--version', '-V'], dest='version', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help="show program's version number and exit", metavar=None) 
>>> 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' 
%(prog)s 0.1 

更容易只是将该值存储在其他地方,然后将其传递到​​直接使用该值。

0

不,一定不能有办法从argparse中得到它。为什么会有?你告诉认为版本号是什么,而不是相反。 而且你不需要“重新创建”字符串。只需创建一次,然后将其传递给argparse。

我确定它可以以某种方式从argparse上的某个属性获得,但从那里获取它实际上没有任何意义,并且需要使用argparse内部构件,这可能会在将来发生变化。

0

format_version(和print_version它使用format_version)显示parser.version属性,该属性可以与version参数进行设置。但正如Martijn所写的那样,显示版本的方法已被删除。你会收到一条警告消息。

action='version'参数采用不同的路线。它有自己的version参数(但使用parser.version作为备份)。当由参数字符串-v触发时,它显示该版本信息并调用系统退出。

你仍然可以调用-v,并避免与try块,系统退出:

try: 
    p.parse_args(['-V']) 
except SystemExit: 
    pass 

这是很方便的测试,而不是在生产中想要的东西。另外还会陷入其他退出,如帮助和错误。

与任何参数一样,您可以保存到Action的链接,并显示,使用甚至修改其属性。

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的搜索parser._get_optional_actions()的,但更简单。在这种情况下,它的作用是填补了%(prog)s

def foo(action, parser): 
    formatter = parser._get_formatter() 
    formatter.add_text(action.version) 
    return formatter.format_help() 
foo(version_action, parser) 

虽然:

您可以复制_VersionAction.__call__的动作,没有系统的出口,有。

http://bugs.python.org/issue9399'为argparse'提供'print'动作,讨论添加'print'或'write'动作类型。它会像'版本'一样,但没有系统退出,并可能更多地控制格式和打印目标。