2014-11-05 3 views
0

Я пытаюсь вернуть строку версии I, определенную в 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.print_version() или parser.format_version() я None. Одним из решений является вызов parser.parse_args(['-V']), но это также завершает выполнение программы. Я знаю, что могу просто воссоздать строку и передать ее журналу, но я думал, что должен быть способ получить это от argparse. Я использую python v2.7.5 и argparse v1.1.

ответ

0

общественный 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' 

Это использует частные методы, которые могут быть изменены, и все, что вы получите это таже строка, которую вы дали argparse:

>>> 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 

Намного проще просто сохранить это значение где-то еще тоже, а затем передать его в argparseи использовать значение непосредственно.

0

Нет, не должно быть способа получить его от argparse. Зачем это было? Вы говорите argparse, какой номер версии, а не наоборот. И вам не нужно «воссоздавать» строку. Просто создайте его один раз, а затем передайте его в argparse.

Я уверен, что он доступен как-то из какого-то атрибута на argparse, но получить его оттуда действительно не имеет смысла и требует, чтобы вы использовали внутренние элементы argparse, которые могут измениться в будущем.

0

format_versionprint_version который использует format_version) отображает атрибут parser.version, который можно установить с помощью параметра version. Но, как писал Мартийн, этот подход к показу версии лишен. Появится предупреждающее сообщение.

Этот аргумент action='version' принимает другой маршрут. Он имеет свой собственный параметр version (но с использованием parser.version в качестве резервной копии). При срабатывании строки аргумента -v он отображает эту информацию о версии и вызывает выход системы.

Можно еще назвать -v и избежать выхода системы с Ьгу блока:

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) 

Функционально это то же самое, как поиск Мартейн в части parser._get_optional_actions(), но проще.

Вы могли бы повторить действие _VersionAction.__call__, без выхода системы с:

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

Хотя в данном случае все это делает заполнить %(prog)s строки.

http://bugs.python.org/issue9399 «Предоставить действие« print »для argparse», обсуждается добавление типа действия «печать» или «запись». Он будет вести себя как «версия», но без выхода системы и, возможно, большего контроля над форматированием и назначением печати.

Смежные вопросы