标签: python-click

使用日志记录或返回值而不是打印来测试点击

当我测试点击时,我知道基本设置如下所示:

import click

@click.command()
@click.argument('name')
def hello(name):
   click.echo('Hello %s!' % name)
Run Code Online (Sandbox Code Playgroud)

测试文件

from click.testing import CliRunner
from hello import hello

def test_hello_world():
  runner = CliRunner()
  result = runner.invoke(hello, ['Peter'])
  assert result.exit_code == 0
  assert result.output == 'Hello Peter!\n'
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用日志记录而不是打印,则无法捕获输出或检查命令的返回值。例如:

from click.testing import CliRunner
from hello import hello

def test_hello_world():
  runner = CliRunner()
  result = runner.invoke(hello, ['Peter'])
  assert result.exit_code == 0
  assert result.output == 'Hello Peter!\n'
Run Code Online (Sandbox Code Playgroud)

click.echo如果不打印或“ing”它,我无法检查该返回值是否正确。

有没有办法使用单击检查返回值或检查输出与日志记录?

python python-click

4
推荐指数
1
解决办法
1864
查看次数

为什么 CliRunner().invoke(...) 对象的“return_value”为空?

我正在使用 click v8.1.3 并尝试创建一些 pytests,但return_value在使用时没有达到我的预期click.testing.CliRunner().invoke

import click.testing
import mycli

def test_return_ctx():
  @mycli.cli.command()
  def foo():
    return "Potato"
  
  runner = click.testing.CliRunner()
  result = runner.invoke(mycli.cli, ["foo"])

  assert result.return_value == "Potato" # this fails. b/c the actual value is None
Run Code Online (Sandbox Code Playgroud)

我尝试更新 root 命令以返回一些随机值,看看我们是否在那里得到一个值

# mycli
import click

@click.group()
def cli():
  return "Potato"
Run Code Online (Sandbox Code Playgroud)

但这没有帮助。return_value因为Result物体仍然是None

我是否误解了如何从命令返回值?

https://click.palletsprojects.com/en/8.1.x/api/#click.testing.Result.return_value

python command-line-interface pytest python-click

4
推荐指数
1
解决办法
567
查看次数

python点击standalone_mode的用法

这个问题是关于 Python Click库的。

我想单击以收集我的命令行参数。收集后,我想重用这些值。我不想要任何疯狂的回调链,只需使用返回值。默认情况下,单击禁用使用返回值并调用sys.exit()

我想知道如何正确调用standalone_mode( http://click.pocoo.org/5/exceptions/#what-if-i-don-t-want-that ),以防我想使用装饰器样式。上面链接的文档仅显示了使用单击(手动)创建命令时的用法。甚至有可能吗?下面显示了一个最小的例子。它说明了点击sys.exit()返回后如何直接调用gatherarguments

import click

@click.command()
@click.option('--name', help='Enter Name')
@click.pass_context
def gatherarguments(ctx, name):
    return ctx

def usectx(ctx):
    print("Name is %s" % ctx.params.name)

if __name__ == '__main__':
    ctx = gatherarguments()
    print(ctx) # is never called
    usectx(ctx) # is never called 
Run Code Online (Sandbox Code Playgroud)

$ python test.py --name Your_Name

我希望这是无状态的,意味着没有任何click.group功能 - 我只想要结果,而我的应用程序不退出。

python python-click

3
推荐指数
1
解决办法
2019
查看次数

Python单击选项,提示AND默认隐藏

下面的代码段会提示输入用户名和密码,默认为env变量.

现在虽然密码输入在键入时很好地隐藏了,但我也希望隐藏括号之间的默认值,到目前为止,如果我输入此密码,则密码默认为明确1234:

?  export PASSWORD=1234
?  python test.py
?  User [myuser]: you can see here
?  Password [1234]: 
user you can see here
password you cant see


import os
import click

@click.command()
@click.option('--user', prompt=True, default=lambda: os.environ.get('USER', ''))
@click.option('--password', prompt=True, default=lambda: os.environ.get('PASSWORD', ''), hide_input=True)
def test(user, password):
    print('user {}'.format(user))
    print('password {}'.format(password))
    print(password)


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

python python-click

3
推荐指数
1
解决办法
1545
查看次数

Python单击多个命令名称

是否可以使用Python Click执行类似的操作?

@click.command(name=['my-command', 'my-cmd'])
def my_command():
    pass
Run Code Online (Sandbox Code Playgroud)

我希望命令行如下所示:

mycli my-command
Run Code Online (Sandbox Code Playgroud)

mycli my-cmd 
Run Code Online (Sandbox Code Playgroud)

但引用相同的功能。

我需要像AliasedGroup这样的课程吗?

python alias command python-click

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

如何在“ --help”中定义单击子命令的顺序

我有这样的代码:

import click

@click.group()
def entry_point():
    pass

entry_point.add_command(lidtk.data.download_documents.main)
entry_point.add_command(lidtk.data.create_ml_dataset.main)
entry_point.add_command(lidtk.classifiers.text_cat.textcat_ngram.cli)
Run Code Online (Sandbox Code Playgroud)

给出帮助文本:

import click

@click.group()
def entry_point():
    pass

entry_point.add_command(lidtk.data.download_documents.main)
entry_point.add_command(lidtk.data.create_ml_dataset.main)
entry_point.add_command(lidtk.classifiers.text_cat.textcat_ngram.cli)
Run Code Online (Sandbox Code Playgroud)

这是在所有非常接近我想要的东西。但我想将顺序更改为:

lidtk --help
Usage: lidtk [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  create-dataset  Create sharable dataset from downloaded...
  download        Download 1000 documents of each language.
  textcat
Run Code Online (Sandbox Code Playgroud)

如何使用点击完成操作?

python command-line-interface python-3.x python-click

3
推荐指数
2
解决办法
1166
查看次数

单击:在具有上下文对象的链接命令中使用另一个函数

我最近一直在使用click 包来构建命令行界面,到目前为止,它运行良好。

现在我在将链接命令与上下文对象结合使用时遇到了一些麻烦。问题是当我想从另一个命令中调用另一个命令的函数时,我以某种方式收到错误。

这可能与 click 中装饰器的使用有某种关系,但我现在没有看到错误。

这是我的代码的最小示例:

import click


@click.group(chain=True)
@click.option('--some_common_option', type=float, default=1e-10)
@click.pass_context
def cli(ctx, some_common_option):
    # save shared params within context object for different commands
    for k, v in locals().items():
        if 'ctx' not in k:
            ctx.obj[k] = v

    return True


@cli.command()
@click.argument('some_argument', type=str)
@click.pass_context
def say_something(ctx, some_argument):
    print(some_argument)

    return True


@cli.command()
@click.argument('some_other_argument', type=str)
@click.pass_context
def say_more(ctx, some_other_argument):
    ctx.obj['text'] = some_other_argument
    say_something(ctx, ctx.obj['text'])

    return True


if __name__ == '__main__':
    cli(obj={})
Run Code Online (Sandbox Code Playgroud)

这是终端上提供的错误:

$ python test.py say_something 'Hello!'
Hello! …
Run Code Online (Sandbox Code Playgroud)

python python-click

3
推荐指数
1
解决办法
1682
查看次数

如果不正确或单击任务选项,则显示帮助

当我将无效参数放入命令时,仅显示以下内容:

Usage: ugen.py [OPTIONS]

Error: Missing option "-o" / "--out_file".
Run Code Online (Sandbox Code Playgroud)

想像 --help选项一样显示整个帮助消息

我的装饰功能:

@click.command(name="ugen")
@click.help_option("-h", "--help")
@click.option(
    "-o", "--out_file",
    help="Output file where data is written.",
    required=True
)
@click.option(
    "-i", "--in_file", multiple=True,
    help=(
        "Input file/s from which data is read. "
        "Can be provided multiple times. "
        "Although always with specifier -i/--in_file."
    ),
    required=True
)
def main(out_file, in_file):
    code here
Run Code Online (Sandbox Code Playgroud)

python python-3.x python-click

3
推荐指数
1
解决办法
1056
查看次数

3
推荐指数
1
解决办法
1873
查看次数

如何使用 click、coverage.py 和 Tox 测试 Python CLI 程序?

我正在使用click开发一个 CLI 程序,我想开始添加一些使用coverage.py进行代码覆盖分析的测试。

我认为实现测试的一个好方法是使用子进程运行 CLI 本身。然而,coverage.py 报告零代码覆盖率,大概是因为子进程产生的 Python 实例没有coverage.py 检测。

我发现这个链接说我可以sitecustomize.py在我的 PYTHONPATH 中放置一个文件以始终强制 Python 开始覆盖率测量,但我正在使用 Tox 创建一个 venv 并运行测试。我找不到任何处理此问题的 Tox 设置。

我发现这个答案是说我应该只是运行通过我的CLI coverage run,但它看起来像,如果给一个Python脚本的路径,只有工作,我试图通过定义的入口点运行我的CLI setup.py。即我必须将测试代码中的所有命令行从myprogram更改为coverage run myprogram/cli/cli.py。我宁愿不这样做,因为这不是我期望用户运行程序的方式。

所以看起来两个选项是:

  1. 找出一种sitecustomize.py在 Tox 环境中工作的方法,或者

  2. 测试代码中的所有命令行都使用脚本路径而不是入口点(从长远来看可能更容易,但会使测试变得更加脆弱和难以理解)。想知道是否还有什么我遗漏的。

python code-coverage coverage.py python-click

3
推荐指数
1
解决办法
2321
查看次数