2017-02-17 3 views
1

Мне нужен скрипт, чтобы просмотреть аргументы, приведенные в командной строке, и выдать сообщение об ошибке, если в одной командной строке указаны два конкретных аргумента.Найти несколько аргументов в команде getopt Python 3

Обратите внимание, что параметры b & c являются взаимоисключающими.

Мне нужно иметь способ, чтобы в командной строке отображались как -b & -c, система выдаст сообщение об ошибке и выйдет. Также, если есть другой способ написать код?

Спасибо, NH

Мой пример кода, как это:

import getopt 

def main(): 
    x = '' 

    try: 
      opts, args = getopt.getopt(sys.argv[1:], "habc",["help","Task_a", "Task_b", "Task_c"]) 
    except getopt.GetoptError: 
      print("Wrong Parameter") 
      sys.exit() 
    for opt, args in opts: 
     if opt in ("-h", "--help"): 
      x = "h" 

     elif opt in ("-a", "--Task_a"): 
      x= "a" 

     elif opt in ("-b", "--Task_b"): 
      x = "b" 

     elif opt in ("-c", "--Task_c"): 
      x = "c" 

     else: 
      x = "something Else" 

    return x 
if __name__ =="main": 
    main() 
print(main()) 
+0

Почему бы не установить простой счетчик, который увеличивает когда либо -b или -c является а затем проверить, превышает ли значение значение 1 и отображает ошибку? – grail

ответ

2

Прежде всего, вы должны использовать argparse модуль, который поддерживает mutual exclusion.

Чтобы ответить на ваш вопрос, вы можете использовать эту простую логику

optnames = [opt[0] for opt in opts] 
if (("-b" in optnames or "--Task-b" in optnames) and 
     ("-c" in optnames or "--Task-c" in optnames)): 
    print("-b and -c are mutually exclusive", file=sys.stderr) 
    sys.exit() 
+0

Привет Спасибо за ваш ответ. Я не мог заставить его работать. для тестирования я помещаю его в этот код: 'import getopt import sys opts, args = getopt.getopt (sys.argv [1:]," habc ", [" help "," Task_a "," Task_b " , "Task_c"]) if ("-b", "--Task_b") в опциях и ("-c", "--Task_c") в опциях: print ("- b и -c взаимно exclusive ", file = sys.stderr) sys.exit() else: print (" Аргументы в порядке ")' – nhrcpt

+0

Видимо, я дал вам неправильное состояние. Я обновил ответ сейчас. This WILL work –

+0

Спасибо, Shiplu. На самом деле это то, что я искал. Он работает красиво. – nhrcpt

1

Используйте argparse для этого.

Вот простой пример, чтобы сделать его работу:

parser = argparse.ArgumentParser(description='Doing some tasks') 
parser.add_argument('-b', action='store_true', help="Proceed to task B") 
parser.add_argument('-c', action='store_true', help="Proceed to task C") 

args = parser.parse_args('-b -c'.split()) 

if args.b and args.c: 
    sys.exit() 

if args.b: 
    # do something 
if args.c: 
    # do something else 

EDIT: Вы можете также использовать взаимоисключающие группы. Спасибо за предложение shiplu.

parser = argparse.ArgumentParser(description='Doing some tasks') 
group = parser.add_mutually_exclusive_group() 
group.add_argument('-b', action='store_true', help="Proceed to task B") 
group.add_argument('-c', action='store_true', help="Proceed to task C") 

И тогда, когда вы пытаетесь ввести оба аргумента:

In [80]: args=parser.parse_args('-b -c'.split()) 
usage: ipython [-h] [-b | -c] 
ipython: error: argument -c: not allowed with argument -b 
An exception has occurred, use %tb to see the full traceback. 

SystemExit: 2 

В противном случае,

In [82]: parser.parse_args('-b'.split()) 
Out[82]: Namespace(b=True, c=False) 

In [83]: parser.parse_args('-c'.split()) 
Out[83]: Namespace(b=False, c=True) 
+1

Если вы используете argparse, почему бы не использовать 'add_mutually_exclusive_group'? –

+0

Спасибо, elena за ваше решение. Я не был знаком с argparse, поэтому я не использовал его, но теперь я вижу, как легко его можно использовать в этой ситуации. Отличная работа !! – nhrcpt