2016-07-20 2 views
0

У меня есть следующий код Python, который имеет 1 командной строки необязательный параметр (c), который имеет аргумент и 2 варианта (a и b), которые не имеют аргумент:Python параметр командной строки не поднимая ошибку, если аргумент ошибочно используется

import sys, getopt 

def main(argv): 
    inputfile = '' 
    outputfile = '' 
    try: 
     opts, args = getopt.getopt(argv,"abc:",["csvfile="]) 
    except getopt.GetoptError: 
     print 'Error in usage - a does not require an argument' 
     sys.exit(2) 
    for opt, arg in opts: 
     print "Raw input is: {}" .format(opt) 
     if opt in ("-c", "--csvfile"): 
     outputfile = arg 
     print 'Output file is {}' .format(outputfile) 
     elif opt == '-a': 
     print 'Alpha' 
     elif opt == '-b': 
     print 'Beta' 
     print 'User choice is {}' .format(opt.lstrip('-')) 

if __name__ == "__main__": 
    main(sys.argv[1:]) 

Когда я вхожу python readwritestore.py -a я получаю:

Raw input is: -a 
Alpha 
User choice is a 

Это то, что я надеялся, если аргумент командной строки -a. Однако, если я вхожу python readwritestore.py -a csvfile_name, то я получаю:

Raw input is: -a 
Alpha 
User choice is a 

Это не то, что я предназначен. В этой функции c является единственным вариантом, который запрашивает аргумент. Если я вхожу a с аргументом, код должен дать сообщение об ошибке, что я настроить

Error in usage - a does not require an argument 

Это не происходит для a или b. Это позволяет вводить аргумент без повышения ошибки.

Если параметры, которые не требуют аргумента, вводятся с аргументом, то я хотел бы, чтобы он вызывал ошибку. python readwritestore.py -a text и python readwritestore.py -b text следует поднять с ошибкой Error in usage - a does not require an argument.

Есть ли способ указать это? Правильно ли это делается getopt()?

Дополнительная информация:

Я только хочу python readwritestore.py -c text работать с аргументом. Для остальных 2 опций, a и b, код должен поднять ошибку.

+1

Возможно, вы захотите рассмотреть ['argparse'] (https://docs.python.org/3/library/argparse.html), более интуитивно понятный модуль Python для этого. –

+0

У меня есть много вопросов по управлению аргументом для скрипта без lib. Но с [Argparse] (https://docs.python.org/2/howto/argparse.html) это очень просто. Я могу опубликовать anwser, используя эту библиотеку, если вы хотите. – pwnsauce

+0

Собирался предложить то же самое, если у вас нет проблем с изменением, дайте argparse выстрел – Samuel

ответ

1

проверка размера sys.argv (список аргумента, переданный при вызове сценария) может помочь вам проверить, что:

Я знаю, что это не то, что вы просили (argparse), но вот как ты мог бы сделать это с помощью argparse:

from argparse import * 

def main(): 
    parser = ArgumentParser() 
    parser.add_argument('-c', '--csvfile', help='do smth with cvsfile') 
    parser.add_argument(
     '-a', '--Alpha', help='Alpha', action='store_true') 
    parser.add_argument(
     '-b', '--Beta', help='beta smth', action='store_true') 
    if args.csvfile: 
     print 'Output file is {}' .format(args.csvfile) 
    if args.Alpha: 
     print 'Alpha' 
    if args.Beta: 
     print 'Beta' 

if __name__ == "__main__": 
    main() 

Это вызовет ошибку для многих аргументов. (также python readwritestore.py -h отобразит справку точно так же, как человек в unix)

+0

Это именно то, что я сделал! Спасибо, что поймали его. Но 'argparse' выглядит намного лучше. Я должен посмотреть на это. Спасибо за предложение. –

+0

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

+0

@WR Я понимаю вас, в первый раз, когда вы его используете, это кажется испорченным.Чтобы узнать это, я просто скопировал примеры из Doc и попытался проверить ценность и попытался понять, что добавляет. вот крошечный пример, в котором я сидел: [SO instanceple] (http://stackoverflow.com/questions/7427101/dead-simple-argparse-example-wanted-1-argument-3-results) – pwnsauce