标签: python-click

如何在python中为命令行应用程序构建交互式菜单?

我一直在使用click来制作一个命令行程序.现在我正以非常文本的方式实现交互式菜单.例如:

1-option #1
2-option #2
Enter the index of the option you want to select: 
Run Code Online (Sandbox Code Playgroud)

但我希望以更优雅和互动的方式做到这一点.例如,我喜欢Yeoman实现其菜单的方式.这是菜单的实际应用. 在此输入图像描述

是否有任何python库让我们构建这样的命令行菜单?我看过curses,cmd等库.但它们似乎给你一个完整的单独窗口来管理和看起来有点unpythonic.

python command-line-interface python-click

6
推荐指数
1
解决办法
4126
查看次数

是否可以在基于Click的界面中为所有子命令添加全局参数?

我在virtualenv下使用Click并使用entry_pointsetuptools中的指令将根映射到一个名为dispatch的函数.

我的工具公开两个子serveconfig,我使用在顶级组的选项,以确保用户总是通过一个--path指令.但用法结果如下:

mycommand --path=/tmp serve
Run Code Online (Sandbox Code Playgroud)

无论是serveconfig子命令需要确保用户始终在传递路径和理想,我想目前的CLI为:

mycommand serve /tmp` or `mycommand config validate /tmp
Run Code Online (Sandbox Code Playgroud)

当前基于Click的实现如下:

# cli root

@click.group()
@click.option('--path', type=click.Path(writable=True))
@click.version_option(__version__)
@click.pass_context
def dispatch(ctx, path):
    """My project description"""
    ctx.obj = Project(path="config.yaml")

# serve

@dispatch.command()
@pass_project
def serve(project):
    """Starts WSGI server using the configuration"""
    print "hello"

# config

@dispatch.group()
@pass_project
def config(project):
    """Validate or initalise a configuration file"""
    pass

@config.command("validate")
@pass_project
def config_validate(project):
    """Reports on the validity of …
Run Code Online (Sandbox Code Playgroud)

python command-line-interface python-click

6
推荐指数
1
解决办法
664
查看次数

如何使用Sphinx记录单击命令?

click是用于开发CLI应用程序的流行Python库。sphinx是用于记录Python软件包的流行库。一些人面临的一个问题是集成这两个工具,以便它们可以为基于单击的命令生成Sphinx文档。

我最近遇到了这个问题。我用click.command和装饰了一些函数,click.group向它们添加了文档字符串,然后使用Sphinx的autodoc扩展为其生成了HTML文档。我发现它省略了这些命令的所有文档和参数说明,因为它们在Commandautodoc到达时已被转换为对象。

我如何修改代码,以使命令的文档既可以供最终用户在--helpCLI上运行时使用,又可以供浏览Sphinx生成的文档的人员使用?

python documentation command-line-interface python-sphinx python-click

6
推荐指数
2
解决办法
1054
查看次数

在 Python 中单击如何查看父级具有必需参数的子命令的 --help?

我的程序使用Click进行命令行处理。它有一个带有必需参数的主命令。此命令具有采用可选参数的子命令。不同的子命令采用不同的选项,但它们都需要来自其父命令的相同参数。我想让命令行看起来像这样:

python myprogram.py argument-value subcommand1 --option-1=value
Run Code Online (Sandbox Code Playgroud)

我可以像这样使用 Click 写这个

import click

@click.group()
@click.argument("argument")
@click.pass_context
def main(context, argument):
    """ARGUMENT is required for both subcommands"""
    context.obj = {"argument": argument}


@click.command()
@click.option("--option-1", help="option for subcommand 1")
@click.pass_context
def subcommand1(context, option_1):
    print("subcommand 1: %s %s" % (context.obj["argument"], option_1))


@click.command()
@click.option("--option-2", help="option for subcommand 2")
@click.pass_context
def subcommand2(context, option_2):
    print("subcommand 2: %s %s" % (context.obj["argument"], option_2))


main.add_command(subcommand1)
main.add_command(subcommand2)

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

顶级帮助信息正是我想要的。

python myprogram.py --help
Usage: myprogram.py [OPTIONS] ARGUMENT COMMAND [ARGS]... …
Run Code Online (Sandbox Code Playgroud)

python python-click

6
推荐指数
1
解决办法
2937
查看次数

一串命令的别名

我有一个tool命令:step1,step2step3.

我可以通过调用来链接它们:

$ tool step1 step2 step3

我希望有一个命名的别名all,通过调用来运行所有步骤:

$ tool all

我找到了一个有效的解决方案,但由于cli()在引擎盖下两次调用,它似乎不适合我:

@click.group(chain=True)
def cli():
    print('cli() has been called')

...

@cli.command()
def all():
    cli(args=['step1', 'step2', 'step3'])
Run Code Online (Sandbox Code Playgroud)

如果没有cli()两次调用的副作用,怎么办呢?

python command-line-interface python-click

6
推荐指数
1
解决办法
409
查看次数

如何将 Python 单击的默认选项设置为 -h?

如何将 Python 单击的默认选项设置为 -h?

默认情况下,我的脚本在没有提供参数时不显示任何内容duh.py

import click


CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'])

@click.command(context_settings=CONTEXT_SETTINGS)
@click.option('--toduhornot', is_flag=True, help='prints "duh..."')
def duh(toduhornot):
    if toduhornot:
        click.echo('duh...')

if __name__ == '__main__':
    duh()
Run Code Online (Sandbox Code Playgroud)

[出去]:

$ python3 test_click.py -h
Usage: test_click.py [OPTIONS]

Options:
  --toduhornot  prints "duh..."
  -h, --help    Show this message and exit.



$ python3 test_click.py --toduhornot
duh...


$ python3 test_click.py 
Run Code Online (Sandbox Code Playgroud)

题:

如上图,默认不打印信息python3 test_click.py

有没有办法,-h如果没有给出参数,则默认选项设置为,例如

$ python3 test_click.py 
Usage: test_click.py [OPTIONS]

Options:
  --toduhornot  prints "duh..."
  -h, --help    Show this message and exit.
Run Code Online (Sandbox Code Playgroud)

python command-line-interface argparse python-click

6
推荐指数
3
解决办法
2516
查看次数

Python Click:多个键值对参数

我的命令行界面使用 Python Click 库。我想要一个接受多个键值对的命令。我在 api 上很灵活。例如

my_cli my_command FOO=1 BAR=2
Run Code Online (Sandbox Code Playgroud)

或者可能

my_cli my_command FOO 1 BAR 2
Run Code Online (Sandbox Code Playgroud)

甚至

my_cli my_command {"FOO": 1, "BAR": 2}
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以通过 Click 做到这一点?

python python-click

6
推荐指数
2
解决办法
3238
查看次数

自动生成有关Click命令的所有帮助文档

有没有一种方法可以使用click为所有命令和子命令生成(和导出)帮助文档?

例如,

cli --help all --destination help-docs.txt

将在命令之后生成命令和子命令的帮助

cli command subcommand

格式化并放入help-docs.txt文件中。

我认为可以完成此操作的唯一方法是使用

cli command subcommand --help

我想要为其生成帮助并将cat其输出到文件的每个子命令,但是如果有一种更简单的方法来使用Click --help功能来完成此操作,那将是很好的选择。

python command-line-interface python-click

6
推荐指数
1
解决办法
180
查看次数

python-click:格式化帮助文本

这个问题是关于点击包的:

  1. 帮助的长文本未按预期显示。
  2. /b也尝试过使用,但似乎影响不大。
  3. cmdpowershell相同的代码有不同的结果,为什么?

问题的屏幕截图

代码:

import click


def command_required_option_from_option(require_name, require_map):

    class CommandOptionRequiredClass(click.Command):

        def invoke(self, ctx):
            require = ctx.params[require_name]
            if require not in require_map:
                raise click.ClickException(
                    "Unexpected value for --'{}': {}".format(
                        require_name, require))
            if ctx.params[require_map[require]] is None:
                raise click.ClickException(
                    "With {}={} must specify option --{}".format(
                        require_name, require, require_map[require]))
            super(CommandOptionRequiredClass, self).invoke(ctx)

    return CommandOptionRequiredClass

required_options = {
    1: 'gs',  # generator_string
    2: 'nosp',  # number_of_sample_points
    3: 'nocp',  # number_of_center_points
}


@click.command(context_settings=dict(max_content_width=800), cls=command_required_option_from_option('doe', required_options))
@click.option('--input', required=True, type=click.Path(exists=True), metavar='FILE', …
Run Code Online (Sandbox Code Playgroud)

python command-line-interface python-click

5
推荐指数
1
解决办法
6848
查看次数

如何在类方法中使用 Python @click 命令装饰器?

我的 Python 脚本有一个名为Command. 我想将我的类的方法作为 CLI 命令调用(类似于python cli-comand.py net get-public-ip)。

我使用了Pythonclick库,但是当我尝试执行它时,它抛出了错误TypeError: get_public_ip() missing 1 required positional argument: 'self'

果然,我没能通过self。有什么方法可以将参数传递到类方法中,或者任何其他方法吗? click主要与函数一起使用。

我的Python脚本如下:

cli命令.py

import click
import urllib.request
from typing import List, AnyStr
from urllib.error import URLError

from ttn_cli.utils.constants import FETCH_PUBLIC_IP_URL


@click.group()
def cli():
    """
    This is the root function of cli module.
    """
    pass


@cli.group()
def net():
    """
    function act as a group which is linked to root cli function.
    """ …
Run Code Online (Sandbox Code Playgroud)

python-3.x python-click python-3.7

5
推荐指数
1
解决办法
1453
查看次数