2014-11-05 52 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'動作類型。它會像'版本'一樣,但沒有系統退出,並可能更多地控制格式和打印目標。