我正在尝试使用click来存储多个文件.例如:
@cli.command("test")
@click.argument('input', type=click.File('rb'))
def test(input):
with click.progressbar(input, label='READING') as bar:
for x in bar:
pass
Run Code Online (Sandbox Code Playgroud)
当我做这样的事情时:
script test ~/ololo/*
Run Code Online (Sandbox Code Playgroud)
我明白了:
Error: Got unexpected extra arguments ( ... listing all files in folder ...)
Run Code Online (Sandbox Code Playgroud) 我使用的Click库,但我似乎无法找到类似行为dest的argparse.
例如,我有
@click.option('--format', type=click.Choice(['t', 'j']))
def plug(format):
pass
Run Code Online (Sandbox Code Playgroud)
请注意,我使用的标志--format被转换为内置的Python构造format,这是不理想的.
有没有办法更改传递给选项的click函数的参数?
最近发现的click,我想将不确定数量的kwargs传递给click命令。目前,这是我的命令:
@click.command()
@click.argument('tgt')
@click.argument('fun')
@click.argument('args', nargs=-1)
def runner(tgt, fun, args):
req = pyaml.p(meh.PostAdapter(tgt, fun, *args))
click.echo(req)
Run Code Online (Sandbox Code Playgroud)
但是,当使用nargs时,将多于1的任何值作为元组([docs] [1])传递,但是我不能那样type=dict做。
但是应该可以这样做:
command positional1 positional2 foo='bar' baz='qux' xxx='yyy'
在此先感谢您提供的任何帮助或建议,与此同时,我将自己继续努力。
@click.group(context_settings=dict(help_option_names=['-h', '--help']))
def plot_glm():
pass
@plot_glm.command()
@click.argument('path_nc')
@click.argument('out_path')
@click.argument('var_name')
@click.option('--xaxis_min', default=0.0, help='')
@click.option('--xaxis_max', default=1.1, help='')
@click.option('--xaxis_step', default=0.1, help='')
@click.option('--annotate_date', help='')
@click.option('--yr', default=0, help='')
@click.option('--date', default=-1, help='')
@click.option('--xlabel', default='', help='')
@click.option('--title', default='', help='')
@click.option('--tme_name', default='time', help='')
@click.option('--show_plot', help='')
@click.option('--any_time_data', help='')
@click.option('--format', default='%.2f', help='')
@click.option('--land_bg', help='')
@click.option('--cmap', default=plt.cm.RdBu, help='')
@click.option('--grid', help='')
@click.option('--fill_mask', help='')
def plot_map_from_nc(path_nc, out_path, var_name, xaxis_min=0.0, xaxis_max=1.1, xaxis_step=0.1,
annotate_date=False, yr=0, date=-1, xlabel='', title='', tme_name='time', show_plot=False,
any_time_data=True, format='%.2f', land_bg=True, cmap=plt.cm.RdBu, grid=False, fill_mask=False)
if __name__ == '__main__':
plot_glm()
Run Code Online (Sandbox Code Playgroud)
使用python click库时,出现此错误(python版本2.7.11,Windows 10,单击版本6.6):
ctx …Run Code Online (Sandbox Code Playgroud) CliRunner列出没有参数在其文档中提供上下文.
以下内容应该是最低工作示例.真正的问题有点不同.可以通过将单击修饰函数移动到其自己的测试覆盖功能中来解决.然后点击功能几乎无用.
import click
from click.testing import CliRunner
class Config():
def __init__(self):
self.value = 651
@click.command()
@click.pass_context
def print_numberinfo(ctx):
if not hasattr(ctx.obj, 'value'):
ctx.obj = Config()
click.echo(ctx.obj.value)
def test_print_numberinfo():
ctx = click.Context(print_numberinfo, obj = Config())
ctx.obj.value = 777
runner = CliRunner()
# how do I pass ctx to runner.invoke?
result = runner.invoke(print_numberinfo)
assert result.output == str(ctx.obj.value) + '\n'
Run Code Online (Sandbox Code Playgroud) 我看到我的EPILOG中没有保留换行符吗?我想知道为什么只在一行包含74字符时才看到换行符吗?
# http://click.pocoo.org/5/commands/
import click, sys
def main_caller(*args, **kwargs):
print('act on arguments', args, kwargs)
EPILOG = '''
# oneline
# twoline
\n
# oneline with 74char x
# twoline with 74char x
'''
@click.group(help='wwwwwwwwww', epilog=EPILOG, invoke_without_command=True, chain=True)
@click.argument('start_or_stop')
@click.option('-v', '--verbose', default=False, help='Print Verbose messages')
@click.option('-l', '--logfile', help='Path to logfile to store log messages')
@click.option('-a', '--action', multiple=True, type=click.Choice(['act1', 'act2', 'act3']), default=['act1', 'act2'])
def cli(*args, **kwargs):
'''foo bar'''
pass
@cli.command()
@click.option('--debug/--no-debug', default=False)
def cmd1(*args, **kwargs):
print('cmd1', args, kwargs)
return 'cmd11111' …Run Code Online (Sandbox Code Playgroud) 如果我click.group()有多个子命令,有没有办法可以将命令行参数传递给组内的子命令?
我知道你可以从组中向下通过context,我知道我可以使用callback在命令之前执行的函数,但我不知道是否有更好的方法来执行此操作而不是使用callback.
一个例子:
@click.group()
def cli():
pass
@cli.command()
@click.argument('task')
@click.argument('task_id')
def sync(task, task_id):
click.echo('Synching: {}'.format(task))
Run Code Online (Sandbox Code Playgroud)
在这个例子中,有没有办法获得task或task_id在组方法?
点击的异常处理的文件中提到,某些类型的例外,如中Abort,EOFError并KeyboardInterrupt自动由框架正常处理.
对于我正在编写的应用程序,有很多要点可以从中生成异常.终止应用程序是正确的步骤,但不打印堆栈跟踪.我总是可以手动执行此操作:
@cli.command()
def somecommand:
try:
# ...
except Exception as e:
click.echo(e)
Run Code Online (Sandbox Code Playgroud)
但是,有没有办法让Click自动处理所有异常?
我想弃用参数别名click(例如,从下划线切换为破折号)。有一阵子,我希望两个公式都有效,但是FutureWarning在使用待弃用的别名调用参数时抛出一个。但是,我还没有找到访问调用参数的实际别名的方法。
简而言之,我要:
click.command()
click.option('--old', '--new')
def cli(*args, **kwargs):
...
Run Code Online (Sandbox Code Playgroud)
用选项调用时发出警告--old,而用调用时不发出警告--new。有没有一种干净的方式来做到这一点,而又不过度依赖未记录的行为?
我尝试将回调添加到中click.option,但在解析该选项后似乎会调用该回调,并且参数不包含实际使用哪个别名的信息。一个解决方案可能会过载click.Option,甚至可能是click.Command,但是我不知道实际的解析发生在哪里。
我正在使用Click来构建一个Python CLI,并遇到了一个问题,即如何在Click中处理异常.
我不确定这里的措辞("子命令","父命令"),但从我的例子中你会得到我希望的想法.我们假设这段代码:
@click.group()
@click.option("--something")
def mycli(something):
try:
#do something with "something" and set ctx
ctx.obj = {}
ctx.obj["somevar"] = some_result
except:
print("Something went wrong")
raise
#only if everything went fine call mycommand
@click.group()
@click.pass_context
def mygroup(ctx):
pass
@mygroup.command(name="mycommand")
@click.pass_context
def mycommand(ctx):
#this only works if somevar is set in ctx so don't call this if setting went wrong in mycli
Run Code Online (Sandbox Code Playgroud)
当应用程序启动时,这称为:
if __name__ == "__main__":
mycli.add_command(mygroup)
mycli()
Run Code Online (Sandbox Code Playgroud)
然后我开始这样的程序:
python myapp --something somevalue mycommand
Run Code Online (Sandbox Code Playgroud)
预期的行为:首先mycli调用它,然后执行其中的代码.如果抛出异常它被except块捕获,则会打印一条消息并引发异常.因为我们没有其他try/except块,所以会导致脚本终止.mycommand …