Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 21, 2015 21:50:25

l1nx
Зарегистрирован: 2015-04-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Трудности с обработкой аргументов командной строки

#!/usr/bin/env python
import sys
if sys.argv[1] == '-h':
    print "Help"
elif len(sys.argv) == 1:
    print "Need 2 arguments: input_dir and output_dir"
elif len(sys.argv) > 3:
    print "Too many arguments"

$ ./test_parsing_argv.py -h
Help
$ ./test_parsing_argv.py 1 2 3 4
Too many arguments
$ ./test_parsing_argv.py
Traceback (most recent call last):
File “./test_parsing_argv.py”, line 3, in <module>
if sys.argv == ‘-h’:
IndexError: list index out of range

Почему ругается если скрипту не дать аргументов?

Офлайн

#2 Апрель 21, 2015 22:01:14

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Трудности с обработкой аргументов командной строки

#!/usr/bin/env python
import sys
if len(sys.argv) == 1:
    print "Need 2 arguments: input_dir and output_dir"
elif len(sys.argv) > 3:
    print "Too many arguments"
elif sys.argv[1] == '-h':
    print "Help"



————————————————
-*- Simple is better than complex -*-

Офлайн

#3 Апрель 21, 2015 22:49:14

l1nx
Зарегистрирован: 2015-04-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Трудности с обработкой аргументов командной строки

terabayt
Почему перестановка if-ов чинит код?

Офлайн

#4 Апрель 21, 2015 23:10:03

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Трудности с обработкой аргументов командной строки

l1nx
Почему перестановка if-ов чинит код?
потому что вы сначала проверяете равен ли первый переданый аргумент “-h”, а потом проверяете на правильное количесвто аргументов
а нужно вначале проверить количество аргументов, а потом уже проверять чему они равны!



————————————————
-*- Simple is better than complex -*-

Офлайн

#5 Апрель 22, 2015 11:11:43

l1nx
Зарегистрирован: 2015-04-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Трудности с обработкой аргументов командной строки

Поправила код. Теперь так:

#!/usr/bin/env python
import sys
if len(sys.argv) == 2 and (sys.argv[1] == '-h' or sys.argv[1] == 'help'):
    print "Need 2 arguments: input_dir and output_dir"
    sys.exit()
elif len(sys.argv)!= 3:
    print "Error: need 2 arguments: input_dir and output_dir"
    sys.exit()

Офлайн

#6 Апрель 22, 2015 14:54:43

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Трудности с обработкой аргументов командной строки

sys.exit()
не обязательно
#!/usr/bin/env python
import sys
if len(sys.argv) == 2 and (sys.argv[1] == '-h' or sys.argv[1] == 'help'):
    print "Need 2 arguments: input_dir and output_dir"
elif len(sys.argv)!= 3:
    print "Error: need 2 arguments: input_dir and output_dir"



————————————————
-*- Simple is better than complex -*-

Офлайн

#7 Апрель 22, 2015 16:45:52

l1nx
Зарегистрирован: 2015-04-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Трудности с обработкой аргументов командной строки


terabayt
sys.exit()
не обязательно
т.е. если один из if-ов сработает то программа дальше не будет выполнятся?

Офлайн

#8 Апрель 22, 2015 17:26:11

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Трудности с обработкой аргументов командной строки

l1nx
т.е. если один из if-ов сработает то программа дальше не будет выполнятся?
будет
но у вас не должно быть что-то дальше
проверка на комманды и передаете в функции

а если у вас не так, то тогда можно стандартной функцией exit
#!/usr/bin/env python
import sys
if len(sys.argv) == 2 and (sys.argv[1] == '-h' or sys.argv[1] == 'help'):
    exit("Need 2 arguments: input_dir and output_dir")
elif len(sys.argv)!= 3:
    exit("Error: need 2 arguments: input_dir and output_dir")



————————————————
-*- Simple is better than complex -*-

Офлайн

#9 Апрель 23, 2015 01:03:41

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Трудности с обработкой аргументов командной строки

terabayt
можно стандартной функцией exit
Функция exit() не используется в скриптах.

argparse там нужно сделать, он как раз sys.argv обрабатывает, только всё удобно и компактно.



Отредактировано py.user.next (Апрель 23, 2015 01:09:40)

Офлайн

#10 Апрель 23, 2015 01:41:10

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Трудности с обработкой аргументов командной строки

py.user.next
exit() не используется в скриптах
это я еще помню с документации по второму, НО
def setquit():
    """Define new built-ins 'quit' and 'exit'.
    These are simply strings that display a hint on how to exit.
    """
    if os.sep == ':':
        eof = 'Cmd-Q'
    elif os.sep == '\\':
        eof = 'Ctrl-Z plus Return'
    else:
        eof = 'Ctrl-D (i.e. EOF)'
    class Quitter(object):
        def __init__(self, name):
            self.name = name
        def __repr__(self):
            return 'Use %s() or %s to exit' % (self.name, eof)
        def __call__(self, code=None):
            # Shells like IDLE catch the SystemExit, but listen when their
            # stdin wrapper is closed.
            try:
                sys.stdin.close()
            except:
                pass
            raise SystemExit(code)
    builtins.quit = Quitter('quit')
    builtins.exit = Quitter('exit')
в книге Бизли по модулю sys написано
“Осуществляет выход из интерпретатора путем активации исключения SystemExit”

и какая тогда разница что использовать
мол может быть запущен скрипт без инициализации site и тогда не будет добавлена функция exit
другого объяснения я прост не вижу

не, ну если написано в документации то тут не поспоришь, но все-таки…
я уже и забыл когда последний раз это использовал, но вопрос интересный



————————————————
-*- Simple is better than complex -*-

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version