标签: python-click

python-click:添加修改其他参数行为的选项

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

Click 是一个 Python 包,用于以可组合的方式使用尽可能少的代码创建漂亮的命令行界面。它是“命令行界面创建工具包”。它是高度可配置的,但带有开箱即用的合理默认值。

它旨在使编写命令行工具的过程变得快速而有趣,同时还可以防止因无法实现预期的 CLI API 而造成的任何挫折。

我想将 a 添加click.Option到 my click.Command,这会更改该命令的其他参数的行为。考虑以下示例:

@click.option('--x', default=42, prompt=True)
@click.command
def cli_a(x):
  print(x)


@click.option('--x', default=42, prompt=False)
@click.command
def cli_b(x):
  print(x)
Run Code Online (Sandbox Code Playgroud)

如果cli_a在未明确指定x的情况下调用,则会提示用户提供一个值(或使用 ENTER 确认默认值)。如果cli_b在未指定x默认值的情况下调用,则在不提示用户的情况下使用。

我现在想添加一个标志click.Option,允许用户在上述变体之一之间进行选择(在运行时)。所以,调用cli_c --i会像cli_a,调用cli_c会像cli_b.

@click.option('--i', is_flag=True, default=False, expose_value=False)
@click.option('--x', default=42, prompt=False)
@click.command
def cli_c(x):
  print(x)
Run Code Online (Sandbox Code Playgroud)

这对当前的 API 可行吗?可行吗?

类似的用例类似于anwser-all-confimation-prompts-with-yes标志。通常,如果 cli 工具应该可以由用户交互使用并且通过脚本或类似的东西在自动模式下使用,则会出现这种情况。

python command-line-interface python-click

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

为点击解析器选择目标变量

我想知道如何覆盖click.option( Click lib ) 的目标变量。例如在这样一段代码中

import click

@click.command()
@click.option('--output', default='data')
def generate_data(output_folder):
    print(output_folder)
Run Code Online (Sandbox Code Playgroud)

所以我想使用--output标志但将其值传递给output_folder参数,有点像这样:@click.option('--output', default='data', dest='output_folder')?点击有这种能力吗?我知道 argparse 允许这种行为。

python command-line command-line-interface command-line-arguments python-click

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

如何在基于Click的CLI应用程序的单元测试中模拟组件?

我不确定这是否最适合这里或Programmers Stack Exchange,但是我会先在这里尝试,如果不合适的话,将其交叉张贴在那儿。

我最近开发了一个Web服务,并且试图创建一个基于Python的命令行界面以使其更易于交互。为了使用简单的脚本,我已经使用Python一段时间了,但是我对创建成熟的程序包(包括CLI应用程序)缺乏经验。

我研究了各种软件包来帮助创建CLI应用程序,并且决定使用click。我关心的是在实际将所有应用放在一起之前,如何构造应用程序以使其可完全测试,以及如何使用click来帮助实现这一点。

我已经阅读了click的测试文档,并检查了API相关部分,尽管我设法使用它来测试简单的功能(在作为参数传递给CLI时进行验证--version--help工作),但我不确定如何处理更高级的测试用例。

我将提供一个具体示例,说明我现在要测试的内容。我正在计划我的应用程序具有以下类型的体系结构...

建筑

...其中CommunicationService封装了通过HTTP连接和直接与Web服务通信所涉及的所有逻辑。我的CLI提供了Web服务主机名和端口的默认值,但应允许用户通过显式的命令行参数,编写配置文件或设置环境变量来覆盖它们:

@click.command(cls=TestCubeCLI, help=__doc__)
@click.option('--hostname', '-h',
              type=click.STRING,
              help='TestCube Web Service hostname (default: {})'.format(DEFAULT_SETTINGS['hostname']))
@click.option('--port', '-p',
              type=click.IntRange(0, 65535),
              help='TestCube Web Service port (default: {})'.format(DEFAULT_SETTINGS['port']))
@click.version_option(version=version.__version__)
def cli(hostname, port):
    click.echo('Connecting to TestCube Web Service @ {}:{}'.format(hostname, port))
    pass


def main():
    cli(default_map=DEFAULT_SETTINGS)
Run Code Online (Sandbox Code Playgroud)

我想测试一下,如果用户指定了不同的主机名和端口,那么ControllerCommunicationService使用这些设置而不是默认值实例化一个。

我想最好的方法是遵循以下原则:

def test_cli_uses_specified_hostname_and_port():
    hostname = '0.0.0.0'
    port = 12345
    mock_comms = mock(CommunicationService)
    # Somehow …
Run Code Online (Sandbox Code Playgroud)

python testing mocking command-line-interface python-click

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

python点击,使选项值可选

我正在使用Python 2开发一个小型命令行工具,然后单击。我的工具要么需要写一个值,要么读它,要么不改变它。如果我能做到以下几点就好了:

mytool --r0=0xffff.....将值设置r00xffff
mytool --r0......................读取值 r0
mytool...... …………不要做任何事情r0

根据文档,这似乎不可能,但我可能错过了。那么有可能还是我必须找到不同的方法?

python python-2.7 python-click

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

单击中的 HelpFormatter

我在本地模块中使用click并且我想调整帮助的显示方式:

当前输出--help

Usage: __main__.py [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  foo     Foo is a program very nice and pretty...
Run Code Online (Sandbox Code Playgroud)

默认情况下,prog名称为__main__.py并且文本被修剪为 78 个字符。

我发现这可以使用HelpFormatter类进行调整。但我不知道如何在这种情况下使用它。

当前代码:

import click

@click.group()
def main(ctx):
   pass

@main.command()
def foo():
   pass

click.CommandCollection(sources=[main])()
Run Code Online (Sandbox Code Playgroud)

预期输出:

Usage: my_module_name [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  foo     Foo is a program very nice and pretty and this sentence is very long.
Run Code Online (Sandbox Code Playgroud)

python python-click

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

使用Click向组添加通用参数

我正在尝试使用Python库Click,但是很难使示例工作。我定义了两组,其中一组(group2)用于处理该组命令的通用参数。我想要实现的是那些通用参数由组函数(group2)处理并分配给上下文变量,因此它们可以由实际命令使用。

一个用例是许多需要用户名和密码的命令,而有些则不需要(甚至不是可选的)。

这是代码

import click


@click.group()
@click.pass_context
def group1(ctx):
    pass


@click.group()
@click.option('--optparam', default=None, type=str)
@click.option('--optparam2', default=None, type=str)
@click.pass_context
def group2(ctx, optparam):
    print 'in group2', optparam
    ctx['foo'] = create_foo_by_processing_params(optparam, optparam2)


@group2.command()
@click.pass_context
def command2a(ctx):
    print 'command2a', ctx['foo']


@group2.command()
@click.option('--another-param', default=None, type=str)
@click.pass_context
def command2b(ctx, another_param):
    print 'command2b', ctx['foo'], another_param

# many more more commands here...
# @group2.command()
# def command2x():
# ...


@group1.command()
@click.argument('argument1')
@click.option('--option1')
def command1(argument1, option1):
    print 'In command2', argument1, option1

cli = …
Run Code Online (Sandbox Code Playgroud)

python python-click

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

单击:是否可以将多个输入传递给 CliRunner.invoke?

我有一个单击命令download,它会在下载一系列文件之前提示用户输入用户名和密码:

$ python download.py
Username: jkarimi91
Password: 1234
Download complete!
Run Code Online (Sandbox Code Playgroud)

要测试此命令,我需要能够分别将 ausername和 a传递passwordstdin. 该CliRunner.invoke()方法有一个input参数,但它不接受列表。是否可以将多个输入传递给CliRunner.invoke()

python command-line-interface python-2.7 python-click

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

在 python click 中为两个组提供一个命令?

我正在使用 click 在 Python 中编写一个 cli 程序,我需要编写如下内容:

import click


@click.group()
def root():
    """root"""
    pass


@root.group()
def cli():
    """test"""
    pass


@root.group()
def cli2():
    """test"""
    pass


@cli.command('test1')
@cli2.command('test1')
def test1():
    """test2"""
    print 1234
    return


root()
Run Code Online (Sandbox Code Playgroud)

但这将失败:

类型错误:尝试将回调转换为命令两次。

如何在多个组之间共享命令?

python command-line-interface python-2.7 python-click

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

如何在 Python 3 Click 应用程序中遍历 shell 提供的文件列表?

我正在使用Click库(几乎没有使用它的经验)和 Python 3.6编写控制台应用程序。

我需要一个可以从 OS shell 像这样调用的程序:

myapp --myoptiona=123 --myoptionb=456 *
Run Code Online (Sandbox Code Playgroud)

遍历当前目录中所有文件的列表(或掩码指定的任何文件)并对它们执行某些操作。

如何通过 Click 实现这一点?

python command-line-interface python-click python-3.6

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

禁止在python click中传递多个功能开关

Python click 允许将一些命令行选项指定为“功能开关”。来自官方文档的示例:

@click.command()
@click.option('--upper', 'transformation', flag_value='upper',
              default=True)
@click.option('--lower', 'transformation', flag_value='lower')
def info(transformation):
    click.echo(getattr(sys.platform, transformation)())
Run Code Online (Sandbox Code Playgroud)

顾名思义,它用于某些功能有多个选项的情况,并且只能选择一个。上面的代码允许将脚本运行为

$ test.py --upper
LINUX2
$ test.py --lower
linux2
$ test.py
LINUX2
Run Code Online (Sandbox Code Playgroud)

但是,同一个脚本允许用户在命令行上指定这两个选项。Click 将静默使用指定的最后一个选项:

$ test.py --upper --lower
linux2
Run Code Online (Sandbox Code Playgroud)

有没有办法强制单击以检查命令行上传递的此类选项不超过一个?

python python-click

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