Читать книгу Мастерство терминальных интерфейсов Python: TUI от основ к профессионализму - - Страница 6
Глава 6. Реагирование на команды пользователя в консольных приложениях
ОглавлениеКонсольные приложения в Python требуют эффективных способов взаимодействия с пользователем. Работа с командами включает обработку аргументов при запуске, создание интерактивных консолей с автодополнением и историей, а также интерпретацию сложных инструкций. Рассмотрим ключевые подходы и инструменты.
## Обработка аргументов командной строки
### Использование `sys.argv`
Для простейших сценариев подходит модуль `sys`:
```python
import sys
if len(sys.argv) > 1:
command = sys.argv[1]
if command == "start":
print("Запуск процесса…")
elif command == "stop":
print("Остановка процесса…")
else:
print("Не указана команда. Допустимые команды: start, stop")
```
### Продвинутая обработка с `argparse`
Для сложных сценариев используйте `argparse`:
```python
import argparse
parser = argparse.ArgumentParser(description="Управление службой")
parser.add_argument("command", choices=["start", "stop", "status"], help="Команда управления")
parser.add_argument("–force", action="store_true", help="Принудительное выполнение")
args = parser.parse_args()
if args.command == "start":
print(f"Служба запущена{' (принудительно)' if args.force else ''}")
elif args.command == "stop":
print(f"Служба остановлена{' (принудительно)' if args.force else ''}")
```
## Интерактивные консольные интерфейсы
### Простой цикл с `input()`
Базовый вариант для построчного ввода:
```python
while True:
user_input = input("> ").strip().lower()
if user_input in ("exit", "quit"):
break
elif user_input == "help":
print("Доступные команды: help, calc, exit")
elif user_input.startswith("calc"):
try:
expr = user_input.split(" ", 1)[1]
result = eval(expr)
print(f"Результат: {result}")
except Exception as e:
print(f"Ошибка: {e}")
```
### Использование `cmd` для структурного проектирования
Модуль `cmd` создает гибкие консольные интерфейсы:
```python
import cmd
class MathConsole(cmd.Cmd):
prompt = "math> "
def do_add(self, arg):
nums = [float(x) for x in arg.split()]
print(f"Сумма: {sum(nums)}")
def do_exit(self, arg):
print("Выход из программы")
return True
if __name__ == "__main__":
MathConsole().cmdloop()
```
## Продвинутые пользовательские интерфейсы с `prompt_toolkit`
Библиотека `prompt_toolkit` предлагает расширенные возможности: автодополнение, подсветку синтаксиса, мультилайн ввод.