我有一个使用最新click包的Python 3.6脚本。我有很多命令,所以我想将一些命令移到单独的模块中。例如。
main.py: root, with commands A and B as children
mylib1.py: commands C and D
mylib2.py: commands E and F
然后在main
中,我想将C“导入”到F,使得main似乎具有所有6个命令,即所有6个都是root的子代。
蛮力维护很多:
# mylib1.py
@click.command()
def cmd1():
...
...
@click.command()
def cmdN():
...
# main.py
import click
from mylib1 import cmd1, cmd2, ... cmdN
@click.group()
def main(): pass
@main.command()
def main_cmd1(): pass
main.add_command(cmd1)
...
main.add_command(cmdN)
少维护(无需管理导入):
# mylib1.py
def add_commands(group):
group.add_command(cmd1)
...
group.add_command(cmdN)
# main.py
import click, mylib
@click.group()
def main(): pass
@main.command()
def main_cmd1(): pass
mylib1.add_commands(main)
main()
但最可维护的似乎是使用click.CommandCollection
,这使我可以使它看起来好像一组中的命令实际上在另一组中一样:
# mylib1.py
import click
@click.group()
def commands():
pass
@commands.command()
def cmd1():
...
...
@commands.command()
def cmdN():
...
# main.py
import click, mylib1
@click.group()
def main_group(): pass
@main_group.command()
def main_cmd1(): pass
main = click.CommandCollection([main_group, mylib1.commands])
main()
这似乎运行良好,到目前为止没有问题,但是CommandCollection
的文档说这不是“建议的”:
将多个脚本合并为一个脚本也很有趣。虽然通常不建议这样做,因为这样会使一个嵌套在另一个之上,但是在某些情况下合并方法对于获得更好的Shell体验很有用。
有人知道“不像建议的那样,因为它嵌套在另一个之间”是什么意思吗?
答案 0 :(得分:0)
从文档中
单击三点:
任意嵌套命令
自动帮助页面生成
支持在运行时延迟加载子命令
我认为第三点(被认为足够重要,可以列入简短名单),为您尝试做的事情提供了最佳方法。
仅当我不是所有者(无法轻松编辑)某些命令代码时,我才倾向于使用click.CommandCollection
。我认为对于您这里的用例,首选解决方案是使用click.MultiCommand
。说明from the docs:
除了使用click.group()之外,您还可以构建自己的自定义多命令。当您要支持从插件延迟加载命令时,这很有用。
docs(此处为SO)有一个简单的用法示例,而更复杂的示例on GitHub被描述为:
complex是构建非常复杂的cli的示例 从中动态加载子命令的应用程序 插件文件夹和其他内容。
在other issues中,如果您需要避免使用CommandCollection
的原因,则github上有一个长期存在的错误,标题为:Adding group to CommandCollection loses group options。
将多个脚本合并为一个脚本也很有趣。虽然通常不建议这样做,因为这样会使一个嵌套在另一个之上,但是在某些情况下合并方法对于获得更好的Shell体验很有用。
您的问题:
有人知道“ ”的意思是“不建议这样做,因为它嵌套在另一个之下” ,这可能是该方法的一些陷阱。
我认为这种重写可能会使语句更清晰。
虽然通常不建议将它们嵌套在另一个下,但合并方法可以是...
我相信那是要说的。