【发布时间】:2018-11-17 22:45:12
【问题描述】:
我正在尝试在我的第一个 Click CLI 应用程序上进行一种递归调用。 要点是将子命令与第一个相关联,因此,我试图将其全部分离到不同的文件/模块中以提高其可维护性。
我有当前的directory:
root
|-commands
|-project
|---__init__
|---command1
|---command2
|-database
|---__init__
|---command1
|---command2
这是我的主文件:
import click
from commands.project import project
from commands.database import database
@click.group(help="Main command")
def main():
pass
main.add_command(project)
main.add_command(database)
我的项目__init__ 文件:
from commands.project.command1 import *
from commands.project.command2 import *
import click
@click.group(help="Projects")
def project():
pass
project.add_command(command1)
project.add_command(command2)
我的commands.project.command1 文件:
import click
@click.command()
def command1():
"""
Execute all the steps required to update the project.
"""
pass
这里的重点是,每次我想添加一个新的子命令时,我都需要:
将带有所有代码的
.py文件添加到命令中,在相应的子命令/子模块文件夹中(显然!)在
__init__文件上添加import声明将此新命令与其父级(在本例中为项目/数据库)相关联
有没有办法做循环/动态加载来避免第 2 步和第 3 步?
编辑
在尝试了 Stephen Rauch 的方式后,它成功地包含了所有提供的文件,但没有一个命令适用于 - 仅具有函数名称(例如: -> update-projectupdate_project)。
root
|-commands
|-project
|---update
|---install_project
|-database
|---command_one
|---command_two
main.py
# main command ----------------------------------------------------------- ###
@click.group(help="CLI tool!", context_settings=dict(max_content_width=120))
def main():
pass
# PROJECT command group -------------------------------------------------------- ###
@main.group(cls=group_from_folder("commands/project"),
short_help="Project installation and upgrade utils.",
help="Project installation and upgrade.")
def project():
pass
commands/project/install_project.py
import click
@click.command(name="install-project",
help="This options allows you to easily install project",
short_help="Install a brand new project")
@click.pass_context
def install_project(ctx):
CLI 结果main project --help (注意install_project 而不是install-project 子命令)
Usage: main project [OPTIONS] COMMAND [ARGS]...
Project installation and upgrade.
Options:
--help Show this message and exit.
Commands:
install_project Install a brand new project one
【问题讨论】:
-
您希望文件名匹配命令函数名而不是命令名?这是我们一直缺少的吗?
-
@StephenRauch 我正在寻找一种方法来添加与函数名不同的命令名(例如:command:
command-one, function on command's file:command_one(python 不允许使用连字符函数 ->-)。 -
@StephenRauch 更改文件名结果,是的,但无法从此文件中导入函数。由于我使用的是多命令调用,因此不适用于此问题。
-
@StephenRauch 我有一些子命令调用另一个子命令。因此,一旦文件名有
-,我将无法import那些文件或其定义。
标签: python python-3.x command-line-interface python-click