2014-01-04 6 views
11

Я пытаюсь научиться argparse для того, чтобы использовать его в моей программе, синтаксис должен быть таким:Пример Python argparse?

-a --aLong <String> <String> 
-b --bLong <String> <String> <Integer> 
-c --cLong <String> 
-h --help 

У меня есть этот код:

#!/usr/bin/env python 
#coding: utf-8 

import argparse 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser(description='Lorem Ipsum') 
    parser.add_argument('-a','--aLong', help='Lorem Ipsum', required=False) 
    parser.add_argument('-b','--bLong', help='Lorem Ipsum', required=False) 
    parser.add_argument('-c','--cLong', help='Lorem Ipsum', required=False) 
    parser.add_argument('-h','--help', help='Lorem Ipsum', required=False) 
    parser.parse_args() 

Вопрос заключается в том, что я читал в официальном документе, видел видеоролики YouTube и т. д., но я не мог понять, как определить количество «под-аргументов» в «главном аргументе»?

Пример: myApp.py -b Foobar 9000, как я могу установить, что -b должен иметь два «суб-аргументы», и как я могу получить значения, Foobar и 9000?

И еще сомнения, я знаю, что могу установить аргумент быть required или нет, но я хотел, чтобы моя программа выполняется только при прохождении по меньшей мере, один аргумент, любой из четырех упоминается.

Возможно, это глупый вопрос, но, к сожалению, я не могу это понять, и, надеюсь, здесь есть кто-то с «учительскими способностями», чтобы объяснить это.

+0

Вы должны быть в состоянии добиться того, что вы упомянули, используя аргумент группы - http://docs.python.org/dev/library/argparse.html#argument-groups. – Danstahr

+1

'arguments-groups' не поможет. Они влияют на дисплей 'help', но не влияют на разбор. Тестирование после синтаксического анализа, как FMc, является способом обеспечения одного из трех аргументов. Взаимозависимые группы могут использоваться для предотвращения использования более 1 группы, но OP хочет «по крайней мере один». – hpaulj

ответ

5
import argparse 

# Use nargs to specify how many arguments an option should take. 
ap = argparse.ArgumentParser() 
ap.add_argument('-a', nargs=2) 
ap.add_argument('-b', nargs=3) 
ap.add_argument('-c', nargs=1) 

# An illustration of how access the arguments. 
opts = ap.parse_args('-a A1 A2 -b B1 B2 B3 -c C1'.split()) 

print(opts) 
print(opts.a) 
print(opts.b) 
print(opts.c) 

# To require that at least one option be supplied (-a, -b, or -c) 
# you have to write your own logic. For example: 
opts = ap.parse_args([]) 
if not any([opts.a, opts.b, opts.c]): 
    ap.print_usage() 
    quit() 

print("This won't run.") 
+3

OP имеет тег 'python-3.x', но этот ответ Python 2. –

+1

Не совсем там: в Python 3 [' filter'] (http://docs.python.org/3/library/functions. html # filter) возвращает итератор, а не список. Вы должны написать 'if not any ([opts.a, opts.b, opts.c]):' вместо этого. –

+0

Спасибо, я понял это сейчас. Просто немного сомневаюсь: я пытался использовать что-то вроде этого: ''-a', '-aLong'', но если я это сделаю, когда я вызываю' opts.a', это дает мне ошибку - 'AttributeError: Объект «Namespace» не имеет атрибута «a», поэтому мне нужно вызвать 'opts.aLong', почему? – JChris

2

Ключом к этому является определение требуемой взаимоисключающей группы.

import argparse 

# Use nargs to specify how many arguments an option should take. 
ap = argparse.ArgumentParser() 
group = ap.add_mutually_exclusive_group(required=True) 
group.add_argument('-a', nargs=2) 
group.add_argument('-b', nargs=3) 
group.add_argument('-c', nargs=1) 


# Grab the opts from argv 
opts = ap.parse_args() 

# This line will not be reached if none of a/b/c are specified. 
# Usage/help will be printed instead. 

print(opts) 
print(opts.a) 
print(opts.b) 
print(opts.c) 
+1

Ваша требуемая группа означает, что требуется только одно из 3. ОП хотел «по крайней мере один». – hpaulj