#python #python-click
#python #python-щелчок
Вопрос:
Я пытаюсь создать интерактивное меню с помощью py-click. В основном просто структура, которая:
- Список доступных команд из текущего меню (с использованием группы щелчков)
- Предоставьте пользователю команду, которая запрашивает его выбор (пользователи вводят имя # / cmd)
- Вызовите команду из этого меню выбора
- Эти команды могут привести либо к другому меню, либо к выполнению кода приложения
- Затем вернитесь в главное меню / предыдущее меню по мере необходимости после запуска кода
Мой код:
import click
@click.group(invoke_without_command=True)
@click.pass_context
def main_group(ctx):
""" Lists all the submenu options available"""
cmds = main_group.list_commands(ctx)
click.echo(f"Available options:")
for idx, cmd_str in enumerate(cmds):
click.echo(f"{idx}:{cmd_str}")
click.echo(f"Now that you know all the options, let's make a selection:")
ctx.invoke(main_group.get_command(ctx, "selection"))
@main_group.command()
@click.option('--next_cmd', prompt='Next command:', help="Enter the number corresponding to the desired command")
@click.pass_context
def selection(ctx, next_cmd):
click.echo(f"You've selected {next_cmd}")
# check that selection is valid
# invoke the desired command
# return to parent previous command
@main_group.command()
def submenu_1():
click.echo('A submenu option ')
@main_group.command()
def submenu_2():
click.echo('Another option')
if __name__ == '__main__':
main_group()
Однако вывод из приведенного выше:
Available options:
0:application-code
1:selection
2:submenu-1
3:submenu-2
Now that you know all the options, let's make a selection:
You've selected None
Process finished with exit code 0
По сути, приглашение из команды выбора не имеет никакого эффекта. Но сама команда выбора работает, потому что, если я запускаю ее напрямую:
if __name__ == '__main__':
# main_group()
selection()
затем мне фактически предлагается мой выбор. Итак … почему приглашение игнорируется? Или основная предпосылка, лежащая в основе моего подхода к созданию этой проблемы, например, Click не предназначен для этого?
РЕДАКТИРОВАТЬ: просматривая кучу репозиториев git, использующих эту библиотеку, включая примеры, которые они предоставляют, я не смог найти ни одного, который строил бы структуру, несколько похожую на то, что я хочу. По сути, парадигма создания click-приложения представляет собой изолированную команду, которая выполняет действие, изменяющее состояние чего-либо, а не столько навигацию по меню, предлагающему различные опции. Не сказать, что это невозможно, но, похоже, это тоже не поддерживается из коробки.
Ответ №1:
На этот вопрос ответов не дано. Я потратил на это еще немного времени. Я немного продвинулся в этом, но я все еще не могу получить что-то вроде:
Main Menu
- Option 1
- Option 2
- Option 3
- Submenu 1
и затем
Submenu 1
- Option 1
- Option 2
- Submenu 2
- Back to Main
и т.д. Я пришел к выводу, что click не является подходящим инструментом для этого. На самом деле, я не уверен, что альтернатива обязательно сделает это намного проще (argparse, docopt, …). Возможно, для этого лучшим подходом было бы просто создать структуру классов самостоятельно.
Или затем используйте подход, который ближе к тому, что использует оболочка или docker, не беспокойтесь о какой-либо навигации по меню и просто запускайте атомарные команды, которые влияют на состояние приложения.
Комментарии:
1. привет, вы смогли добиться какого-либо прогресса?