单击单独文件中的命令

时间:2019-02-13 05:12:55

标签: python python-click

我有一个使用最新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体验很有用。

有人知道“不像建议的那样,因为它嵌套在另一个之间”是什么意思吗?

1 个答案:

答案 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

回答您的问题

quoted中的question一样:

  

将多个脚本合并为一个脚本也很有趣。虽然通常不建议这样做,因为这样会使一个嵌套在另一个之上,但是在某些情况下合并方法对于获得更好的Shell体验很有用。

您的问题:

  

有人知道“ ”的意思是“不建议这样做,因为它嵌套在另一个之下” ,这可能是该方法的一些陷阱。

我认为这种重写可能会使语句更清晰。

  

虽然通常不建议将它们嵌套在另一个下,但合并方法可以是...

我相信那是要说的。