2015-07-08 4 views
1

У меня естьКак сделать парсинг аргументов параметра в python?

fruits = [ apple, banana , pineapple, oranges] 
size = [ small, medium, large] 
fruitproperties = [ color, weight] 

Мой сценарий направлен на создание текстовых файлов для fruitproperties всех фруктов и размера комбинаций. В настоящее время я беру основной каталог в качестве аргумента из командной строки. И скомпилируйте выходы для всех комбинаций.

Ниже мой код:

parser = argparse.ArgumentParser(description = 'Maindirectory required') 
parser.add_argument('maindir' help = ' give maindir path', action = 'store') 
args = parser.parse_args() 

Я хочу сделать это следующим образом:

maindir is compulsory argument 
fruit name is optional argument 

как

file.py <maindirpath> 

будет составлять для всех целей

и когда file.py <maindirpath> -p fruitname дано , он будет компилироваться только для этих фруктов. для всех своих комбинаций , например:

apple-small, apple-medium and apple-large. 
+3

Так что это вопрос? –

+0

В настоящее время я принимаю только maindir как аргумент и компилирую для всех комбинаций. Я также хочу добавить функцию, чтобы пользователь указывал имя фрукта, и он будет компилироваться для всех комбинаций для этих фруктов. если пользователь не укажет, он будет компилироваться для всех фруктов. пользователь в случае должен предоставить file.py -p имя плода –

+0

Я новичок в python. не знаю, как сделать аргумент parsing необязательным. –

ответ

1

Вы можете добавить дополнительные элементы к вашим ArgumentParser

import argparse 

parser = argparse.ArgumentParser(description = 'Maindirectory required') 
parser.add_argument('maindir', help = ' give maindir path', action = 'store') 
parser.add_argument("-p", "--printfruit", help="print specific fruit", type=str) 
args = parser.parse_args() 
print args.maindir 
print args.printfruit 

Некоторые примеры:

  • Требуется по крайней мере maindir

    >python test.py 
    usage: test.py [-h] [-p PRINTFRUIT] maindir 
    test.py: error: too few arguments 
    
  • Обеспечение maindir

    >python test.py C:\Fruits 
    C:\Fruits 
    None 
    
  • Обеспечение как maindir и необязательное значение

    >python test.py C:\Fruits -p apple 
    C:\Fruits 
    apple 
    

Если я понять Ваш комментарий правильно, вы ищете по умолчанию некоторые аргументы, если их нет. Вы можете предоставить default аргумент, и немного манипуляции, чтобы сделать его список:

parser.add_argument("-p", "--printfruit", help="print specific fruit", type=str, default="apple, pineapple, banana") 
args = parser.parse_args() 
fruit = [str(item) for item in args.printfruit.split(',')] 

Теперь используйте переменную fruit, вместо args.printfruit в остальной части вашей программы.

Выходы:

  • Без фруктов

    >python test.py C:\Fruits 
    C:\Fruits 
    apple, pineapple, banana   # This is args.printfruit 
    ['apple', ' pineapple', ' banana'] # This is the fruits variable 
    
  • со значением фруктового

    >python test.py C:\Fruits -p apple 
    C:\Fruits 
    apple  # This is args.printfruit 
    ['apple'] # This is the fruits variable 
    
+0

Спасибо. так что в основном это мой необязательный аргумент и второй. sys.argv [2]. и мой оставшийся код будет использовать его. Итак, как я могу написать, что если этот необязательный аргумент присутствует, do fruit = sys.argv [2] else fruit = [apple, ананас, банан] –

+0

Большое спасибо за это. Да, я хотел того же. У меня просто одно сомнение. В настоящее время я делаю maindir = sys.argv [1] {это мой обязательный аргумент - maindirectory}, а теперь fruit = sys.argv [2]. Теперь дело в том, что если необязательный аргумент отсутствует, тогда мой код будет использовать только maindir. Но иногда дается необязательный аргумент, если в этом случае я должен сделать его fruit = sys.argv [2]. и использовать его. Как я могу добавить это условие в код? что если задан дополнительный аргумент, то fruit = sys.argv [2] else fruits = [apple, banana, anapapple] –

+1

Проверьте, '' sys.argv [2] '' None'. Если это не так, установите «fruit» в переданное значение, в противном случае по умолчанию оно будет указано в вашем списке. В качестве альтернативы, оберните 'try/except', просто присваивая' fruit = sys.argv [2] ', и если вы поймаете' IndexError', вы не получите переданное значение и присвойте свой 'fruit' умолчанию. – Andy

1

Другое решение с помощью docopt, настройте параметр парсер с читаемый человеком строка документация:

#!/usr/bin/env python3 
# coding: utf-8 
"""Print Fruit permutations. 

Usage: 
    fruit.py <maindirpath> [--printfruit=<fruit>...] 
    fruit.py --help 

Arguments: 
    <maindirpath> Base directory to create files in 

Options: 
    -p, --printfruit=<fruit> specify fruit to print 
    -h, --help    display this help and exit 
""" 

from docopt import docopt 

if __name__ == '__main__': 
    args = docopt(__doc__) 
    print(args) 

docopt проверяет синтаксическую корректность и возвращает данные варианты в словаре:

$ ./fruit.py 
Usage: 
    fruit.py <maindirpath> [--printfruit=<fruit>...] 
    fruit.py --help 

$ ./fruit.py foobar 
{'--help': False, 
'--printfruit': [], 
'<maindirpath>': 'foobar'} 

$ ./fruit.py foobar -p apple -p banana 
{'--help': False, 
'--printfruit': ['apple', 'banana'], 
'<maindirpath>': 'foobar'} 
Смежные вопросы