当我测试点击时,我知道基本设置如下所示:
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”它,我无法检查该返回值是否正确。
有没有办法使用单击检查返回值或检查输出与日志记录?
我正在使用 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 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功能 - 我只想要结果,而我的应用程序不退出。
下面的代码段会提示输入用户名和密码,默认为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 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这样的课程吗?
我有这样的代码:
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)
如何使用点击完成操作?
我最近一直在使用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) 当我将无效参数放入命令时,仅显示以下内容:
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) 我目前正在测试 Click CLI 应用程序并获取result.exit_code == 2. 为什么会这样?
我正在使用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。我宁愿不这样做,因为这不是我期望用户运行程序的方式。
所以看起来两个选项是:
找出一种sitecustomize.py在 Tox 环境中工作的方法,或者
测试代码中的所有命令行都使用脚本路径而不是入口点(从长远来看可能更容易,但会使测试变得更加脆弱和难以理解)。想知道是否还有什么我遗漏的。