Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从argparse获取版本字符串_Python_Python 2.7_Argparse - Fatal编程技术网

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)