2013-11-25 5 views
1

Я в тупике. Я пытаюсь передать аргументы в Linux для выполнения определенных операций. Я хочу, чтобы пользователь не вводил слишком много параметров.Python getopt too many arguments

Например желаемый ход сценария будет как таковой:

./audit.py -a 

Я хочу, чтобы предотвратить следующее:

./audit.py -af 

Это, кажется, работает все, что указано на «а» а затем «f». В этом случае, если это похоже на «-af», тогда мне нужно, чтобы он завершил работу с помощью sys.exit(). Мой Len (sys.argv [1:]) всегда дает результат 1 независимо от того, как параметры, которые я поставил в

import getopts 
import sys 
def main(): 
    try: 
     opts, args = getopt.getopt(sys.argv[1:], 'v:adfh') 
    except getopt.GetoptError as err: 
     sys.exit(str(err)) 
    if len(sys.argv[1:]) != 1: 
     sys.exit('Invalid') 

    for o,a in opts: 
     if o in ('-v', '--volume'): 
      print 'Volumes' 
     elif len(sys.argv[2:]) != 0: 
      sys.exit('Too many arguments') 
     elif o in ('-a', '--agent'): 
      print 'Full audit of agents only' 
     elif o in ('-d', '--device'): 
      print 'Full audit of device only' 
     elif o in ('-f', '--full'): 
      print 'Full audit of device/agents' 
     elif o in ('-h', '--help'): 
      sys.exit('Help Section') 
if __name__ == '__main__': 
    main() 
+1

Если вы хотите проверить, сколько опций было указано, почему бы не проверить 'opts'? – user2357112

+0

Только для моего понимания: почему вы не хотите препятствовать кластеризации опций? –

ответ

0

Значение sys.argv[1:] is ['-af'] и если вы будете проверять на ДЛИНА [ «-af»]. 1, поэтому if len(sys.argv[1:]) != 1: всегда неверно. Вместо этого, если вы хотите проверить длину первого аргумента, вам нужно использовать len(sys.argv[1:][0]), либо для каждой длины аргументов.

0

Проблема заключается в том, что sys.argv[1:] производит ломтик. Другими словами, это список. В вашем случае это что-то вроде ['-af']. Поэтому, конечно, длина всегда будет 1, за исключением случаев, когда вы не передали никаких параметров. Возможно, вы намеревались это сделать:

if not all(i < 1 for i in sys.argv[1:]): 
    sys.exit('Invalid') 
0

Вы просматриваете кластеры параметров. Кажется, что нет объекта в getopt, чтобы отключить эту функцию. Тем не менее, вы, вероятно, не должны использовать этот пакет. Может ли argparse быть более подходящим для ваших нужд?

0

Не полный ответ, но вы можете быть рады взглянуть на библиотеку, которую я очень рад найти.

docopts - есть большое видео с описанием, как использовать

Это отличный инструмент, вы просто описать свои аргументы в разделе модуля документа, например .;

''' 
Usage: 
    myprog -a -v <volumes>... 
    myprog -f 
    myprog -h | --help 
''' 
import docopt 
args=docopt.docopt(__doc__) 

Это произведет следующий словарь при запуске как myprog -a -v one two three;

 
{ 
    "--help": false, 
    "-a": true, 
    "-f": false, 
    "-h": false, 
    "-v": true, 
    "": [ 
    "myprog", 
    "one", 
    "two", 
    "three" 
    ] 
}