2012-02-23 4 views
1

Я пытаюсь настроить argparse на моей программе python, но он не работает. Аргументы Пытаюсь процесса заключаются в следующем:Настройка argparse на Python 3.2

или «--interactive» или целое число для первого аргумента, один из них требуется

Любой один из либо «--xml» ИЛИ '--html' OR '--text' OR '--console'. Опять же, это может быть любой из них, но один из них требуется для второго аргумента

И, наконец, для третьего аргумента флаг «--verbose», который является необязательным.

Все эти аргументы изменяют переменные на True, кроме целого числа по первому аргументу.

Это код, который я есть на минуту:

import argparse 

parser = argparse.ArgumentParser(description='Python Historical Event Calculator.', 
          prog='tempus.py') 

inputs = parser.add_mutually_exclusive_group(required=True) 
exports = parser.add_mutually_exclusive_group(required=True) 

inputs.add_argument('integer', metavar='I', type=float, 
       help='percentage to use') 

inputs.add_argument('-i','--interactive', dest='bool_interactive', 
       action='store_true', help='enter interactive mode') 

exports.add_argument('-x','--xml', dest='bool_xml', action='store_true', 
       help='export output as xml') 

exports.add_argument('--html', dest='bool_html', action='store_true', 
       help='export output as html') 

exports.add_argument('-t','--text', dest='bool_text', action='store_true', 
       help='export output as plaintext') 

exports.add_argument('-c','--console', dest='bool_con', action='store_true', 
       help='export output to console') 

parser.add_argument('-v','--verbose', dest='verbose', action='store_true', 
       help='enter verbose/debug mode', required=False) 

args = parser.parse_args() 

Но я понятия не имею, если я нахожусь на правильном пути с этим, хотя, может кто-нибудь помочь? Означает ли это право или я сделал это совершенно неправильно?

Редактировать

Я получаю эту отслеживающий, когда я прохожу любой флаг ему:

Traceback (most recent call last): 
    File "C:\Users\Callum\Dropbox\Tempus\Feature Tests\argparsetest.py", line 9, in <module> 
    help='percentage to use') 
    File "C:\Python32\lib\argparse.py", line 1305, in add_argument 
    return self._add_action(action) 
    File "C:\Python32\lib\argparse.py", line 1528, in _add_action 
    raise ValueError(msg) 
ValueError: mutually exclusive arguments must be optional 
+0

Почему вы не упрощаете и не изменяете его, поэтому ваши опции '--xml',' --html', '--text',' --console' становятся единым флагом, называемым '--output = x ', где' x' может быть 'xml',' html', 'text' или' console', а затем установить для этого значение по умолчанию? Аналогично, '--interactive' может быть необязательным, или' integer' может быть необязательным. В противном случае у вас будет больше логики, чтобы определить, что имеет преимущество над другими. – birryree

+0

У вас есть ошибка? Если да, пожалуйста, покажите трассировку. На первый взгляд ваш код кажется функциональным даже, если вы должны рассмотреть аргументы birryree. Поэтому, если у вас нет ошибок, ваша запись принадлежит -imho- для просмотра кода: http: //codereview.stackexchange.com/ –

+0

@Birryree: Как я могу изменить эти аргументы в этом формате? –

ответ

4

Ваша ошибка, ValueError: mutually exclusive arguments must be optional, произошло потому, что вы добавляете integer (позиционное аргумент), чтобы взаимно эксклюзивная группа. Взаимоисключающие группы относятся только к необязательным аргументам, тогда как позиционные аргументы всегда требуются. Одно из решений состоит в том, чтобы сделать как необязательные аргументы interactive, так и integer и взаимно исключить их.

Я изначально пропустил тот факт, что вы использовали mutually_exclusive_group в своих режимах, так что были указаны только xml, html, console или text, но я изменил его, если вам нравится эта идея.

Этот анализатор будет работать, он делает ваши аргументы interactive и integer взаимоисключающими и делает режим choice list.

#!/usr/bin/env python 

import argparse 

def get_parser(): 
    parser = argparse.ArgumentParser(prog='tempus.py') 
    ex_group = parser.add_mutually_exclusive_group(required=True) 
    parser.add_argument('--mode', type=str, choices=['html', 'xml', 'text', 'console'], required=True) 
    parser.add_argument('-v', '--verbose', action='store_true') 
    ex_group.add_argument('--interactive', action='store_true') 
    ex_group.add_argument('--integer', metavar='I', type=float, help='percentage to use') 
    return parser 

def main(): 
    aparser = get_parser() 
    args = aparser.parse_args() 

    print('mode: %s' % args.mode) 
    print('integer: %s' % args.integer) 
    print('interactive: %s' % args.interactive) 
    print('verbose: %s' % args.verbose) 

# Only used in Python 2.x 
if __name__ == '__main__': 
    main() 

Пример запуска:

+> python .\tempus.py 
usage: tempus.py [-h] --mode {html,xml,text,console} [-v] 
       (--interactive | --integer I) 
tempus.py: error: argument --mode is required 

+> python .\tempus.py --mode html 
usage: tempus.py [-h] --mode {html,xml,text,console} [-v] 
       (--interactive | --integer I) 
tempus.py: error: one of the arguments --interactive --integer is required 

+> python .\tempus.py --mode html --integer 
usage: tempus.py [-h] --mode {html,xml,text,console} [-v] 
       (--interactive | --integer I) 
tempus.py: error: argument --integer: expected one argument 

+> python .\tempus.py --mode html --integer 12 
mode: html 
integer: 12.0 
interactive: False 
verbose: False 
+0

Большое вам спасибо! :) –

0

Изменение integer быть необязательным positional

inputs.add_argument('integer', nargs='?', metavar='I', type=float, ...) 

С этим -i и 33 бы оба быть приняты inputs группой, -i 33 не будет.