我有一个我开发的大型点击应用程序,但导航不同的命令/子命令变得越来越粗糙.如何将命令组织到单独的文件中?是否可以将命令及其子命令组织到单独的类中?
这是我想如何分开它的一个例子:
import click
@click.group()
@click.version_option()
def cli():
pass #Entry Point
Run Code Online (Sandbox Code Playgroud)
@cli.group()
@click.pass_context
def cloudflare(ctx):
pass
@cloudflare.group('zone')
def cloudflare_zone():
pass
@cloudflare_zone.command('add')
@click.option('--jumpstart', '-j', default=True)
@click.option('--organization', '-o', default='')
@click.argument('url')
@click.pass_obj
@__cf_error_handler
def cloudflare_zone_add(ctx, url, jumpstart, organization):
pass
@cloudflare.group('record')
def cloudflare_record():
pass
@cloudflare_record.command('add')
@click.option('--ttl', '-t')
@click.argument('domain')
@click.argument('name')
@click.argument('type')
@click.argument('content')
@click.pass_obj
@__cf_error_handler
def cloudflare_record_add(ctx, domain, name, type, content, ttl):
pass
@cloudflare_record.command('edit')
@click.option('--ttl', '-t')
@click.argument('domain')
@click.argument('name')
@click.argument('type')
@click.argument('content')
@click.pass_obj
@__cf_error_handler
def cloudflare_record_edit(ctx, domain):
pass
Run Code Online (Sandbox Code Playgroud)
@cli.group()
@click.pass_context
def uptimerobot(ctx):
pass
@uptimerobot.command('add')
@click.option('--alert', …Run Code Online (Sandbox Code Playgroud) 我将Quokka Python/Flask CMS下载到CentOS7服务器.命令一切正常
sudo python3 manage.py runserver --host 0.0.0.0 --port 80
Run Code Online (Sandbox Code Playgroud)
然后我创建一个文件/etc/init.d/quokkacms.该文件包含以下代码
start() {
echo -n "Starting quokkacms: "
python3 /var/www/quokka/manage.py runserver --host 0.0.0.0 --port 80
touch /var/lock/subsys/quokkacms
return 0
}
stop() {
echo -n "Shutting down quokkacms: "
rm -f /var/lock/subsys/quokkacms
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
;;
restart)
stop
start
;;
*)
echo "Usage: quokkacms {start|stop|status|restart}"
exit 1
;;
esac
exit $?
Run Code Online (Sandbox Code Playgroud)
但是我在跑步时遇到错误 sudo service quokkacms start
RuntimeError:Click将中止进一步执行,因为Python 3配置为使用ASCII作为环境的编码.切换到Python 2或参考http://click.pocoo.org/python3/ …
运行以下代码会导致此错误:
TypeError:init()得到一个意外的关键字参数'help'
import click
@click.command()
@click.argument('command', required=1, help="start|stop|restart")
@click.option('--debug/--no-debug', default=False, help="Run in foreground")
def main(command, debug):
print (command)
print (debug)
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
$ python3 foo.py start
Traceback (most recent call last):
File "foo.py", line 5, in <module>
@click.option('--debug/--no-debug', default=False, help="Run in foreground")
File "/home/cbetti/python/lib/python3/dist-packages/click-4.0-py3.4.egg/click/decorators.py", line 148, in decorator
_param_memo(f, ArgumentClass(param_decls, **attrs))
File "/home/cbetti/python/lib/python3/dist-packages/click-4.0-py3.4.egg/click/core.py", line 1618, in __init__
Parameter.__init__(self, param_decls, required=required, **attrs)
TypeError: __init__() got an unexpected keyword argument 'help'
Run Code Online (Sandbox Code Playgroud)
为什么会出现此错误?
如何在Click中创建互斥选项组?我想要接受标志"--all"或者使用像"--color red"这样的参数选项.
在flask中创建自定义命令需要访问app,一般是app.py这样创建的:
import click
from flask import Flask
app = Flask(__name__)
@app.cli.command("create-user")
@click.argument("name")
def create_user(name):
...
Run Code Online (Sandbox Code Playgroud)
但是,为了不让我的 app.py 膨胀,我想将我的自定义命令放在一个单独的文件中,例如commands.py,但这不起作用,因为我的项目的入口点是app.py,所以我必须导入应用程序commands.py并导入我的命令app.py会导致循环导入错误。
如何在单独的文件中创建自定义命令?
我想使用一些有用的函数作为命令.为此我正在测试click库.我定义了我的三个原始函数,然后装饰为click.command:
import click
import os, sys
@click.command()
@click.argument('content', required=False)
@click.option('--to_stdout', default=True)
def add_name(content, to_stdout=False):
if not content:
content = ''.join(sys.stdin.readlines())
result = content + "\n\tadded name"
if to_stdout is True:
sys.stdout.writelines(result)
return result
@click.command()
@click.argument('content', required=False)
@click.option('--to_stdout', default=True)
def add_surname(content, to_stdout=False):
if not content:
content = ''.join(sys.stdin.readlines())
result = content + "\n\tadded surname"
if to_stdout is True:
sys.stdout.writelines(result)
return result
@click.command()
@click.argument('content', required=False)
@click.option('--to_stdout', default=False)
def add_name_and_surname(content, to_stdout=False):
result = add_surname(add_name(content))
if to_stdout is True:
sys.stdout.writelines(result) …Run Code Online (Sandbox Code Playgroud) 我知道它是新的,但我喜欢点击很多的外观并且很想使用它,但我无法弄清楚如何将变量从main方法传递给其他方法.我使用不正确,还是这个功能还没有?看起来非常基本,所以我确信它会在那里,但这些事情只是出现了一段时间,所以也许不是.
import click
@click.option('--username', default='', help='Username')
@click.option('--password', default='', help='Password')
@click.group()
def main(**kwargs):
print("This method has these arguments: " + str(kwargs))
@main.command('do_thingy')
def do_thing(**kwargs):
print("This method has these arguments: " + str(kwargs))
@main.command('do_y')
def y(**kwargs):
print("This method has these arguments: " + str(kwargs))
@main.command('do_x')
def x(**kwargs):
print("This method has these arguments: " + str(kwargs))
main()
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,我如何获得其他方法可用的用户名和密码选项
import click
@cli.command()
@click.argument("namespace", nargs=1)
def process(namespace):
.....
@cli.command()
def run():
for namespace in KEYS.iterkeys():
process(namespace)
Run Code Online (Sandbox Code Playgroud)
跑步run('some string')产生:
Error: Got unexpected extra arguments (o m e s t r i n g)
好像Click通过一个字符传递字符串参数.打印参数显示正确的结果.
PS:KEYS字典定义并按预期工作.
以下是导致pylint错误的点击使用的简单示例:
@click.command()
@click.option('--option', is_flag=True)
def foo(option):
click.echo(option)
foo()
Run Code Online (Sandbox Code Playgroud)
foo没有参数,所以我得到了E1120(没有值参数).所以我这样做了:
@click.command()
@click.option('--option', is_flag=True)
def foo(**kwargs):
click.echo(kwargs["option"])
foo()
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?或者在Visual Studio代码中仅禁用一行的pylint的方法?
在使用Python 点击库编写命令行界面(CLI)时,是否可以定义三个选项,只有在第一个(可选)未设置的情况下才需要第二个和第三个选项?
我的用例是一个登录系统,它允许我通过authentication token(选项1),或者通过username(选项2)和password(选项3)进行身份验证.
如果给出了令牌,则无需检查username并password定义或提示它们.否则,如果忽略了此令牌,然后username和password成为必需的,必须给予.
这可以使用回调以某种方式完成吗?
我的入门代码当然不能反映出预期的模式:
@click.command()
@click.option('--authentication-token', prompt=True, required=True)
@click.option('--username', prompt=True, required=True)
@click.option('--password', hide_input=True, prompt=True, required=True)
def login(authentication_token, username, password):
print(authentication_token, username, password)
if __name__ == '__main__':
login()
Run Code Online (Sandbox Code Playgroud)