调用另一个命令并从提示符获取用户输入

2024-10-05 12:26:19 发布

您现在位置: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()

然后,实际上会提示我进行选择。所以为什么会忽略提示?或者,我构建此模型的方法背后的基本前提是否就是问题所在,例如,单击不适用于此

编辑: 通过查看大量使用此库的git repo,包括它们provide的示例,我没有找到任何构建与我想要的结构类似的结构。基本上,构建点击应用程序的范例似乎是一个独立的命令,它执行修改某事物状态的操作,而不是通过提供不同选项的菜单进行导航。不是说这是不可能的,但它似乎也没有得到开箱即用的支持


Tags: the命令echocmdmaindef菜单group
1条回答
网友
1楼 · 发布于 2024-10-05 12:26:19

这个问题没有答案。我在这上面花了更多的时间。我在这方面取得了一点进展,但我仍然无法做到以下几点:

Main Menu
 - Option 1
 - Option 2
 - Option 3
 - Submenu 1

然后

Submenu 1
 - Option 1 
 - Option 2
 - Submenu 2
 - Back to Main

等等。我的结论是,单击不是用于此的正确工具。事实上,我也不确定替代方案是否会使它变得更容易(argparse、docopt等)。也许要做到这一点,最好的方法就是自己构建一个类结构

或者,使用一种更接近shell或docker使用的方法,不需要任何菜单导航,只需启动作用于应用程序状态的原子命令

相关问题 更多 >

    热门问题