Обзор требований
- используйте
argparse
(это я проигнорирую)
- разрешить вызов одного или двух действий (необходимо хотя бы одно).
- попробуйте с помощью Pythonic (я бы предпочел назвать это «POSIX»)
Есть также некоторые неявные требования при работе в командной строке:
- объяснить использование пользователю таким образом, чтобы его было легко понять
- опции должны быть необязательными
- разрешить указывать флаги и опции
- разрешить комбинировать с другими параметрами (такими как имя файла или имена).
Пример решения с использованием docopt
(файл managelog.py
):
"""Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
Попробуйте запустить его:
$ python managelog.py
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Показать справку:
$ python managelog.py -h
Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> P managelog.py [options] upload -- <logfile>...
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
И используйте его:
$ python managelog.py -V -U user -P secret upload -- alfa.log beta.log
{'--': True,
'--pswd': 'secret',
'--user': 'user',
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': False,
'upload': True}
Короткая альтернатива short.py
Возможен и более короткий вариант:
"""Manage logfiles
Usage:
short.py [options] (process|upload)... -- <logfile>...
short.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
Использование выглядит так:
$ python short.py -V process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 1,
'upload': 1}
Обратите внимание, что вместо булевых значений для клавиш «обработать» и «загрузить» стоят счетчики.
Оказывается, мы не можем предотвратить дублирование этих слов:
$ python short.py -V process process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 2,
'upload': 1}
Выводы
Разработка хорошего интерфейса командной строки иногда может быть сложной задачей.
Существует несколько аспектов программы на основе командной строки:
- хороший дизайн командной строки
- выбор/использование правильного парсера
argparse
предлагает многое, но ограничивает возможные сценарии и может стать очень сложным.
С docopt
все становится намного короче, сохраняя удобочитаемость и предлагая высокую степень гибкости. Если вам удастся получить проанализированные аргументы из словаря и выполнить некоторые преобразования (в целое число, открытие файлов..) вручную (или с помощью другой библиотеки с именем schema
), вы можете найти docopt
подходящим для синтаксического анализа командной строки.
person
Jan Vlcinsky
schedule
09.06.2014
-x
является флагом и необязательным. Отрежьте-
, если это необходимо. - person   schedule 17.07.2011process
поведением по умолчанию (без необходимости указывать какие-либо параметры) и позволить пользователю изменить его наupload
, если установлен эта опция? Обычно параметры должны быть необязательными, отсюда и название. Следует избегать обязательных опций (это также есть вargparse
документах). - person Tim Pietzcker   schedule 17.07.2011