Skip to content

czasg/command-controller

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CommandControl

一个用于替代argparse的轻量级命令行控制库.

安装

pip install command-controller

快速开始

初始化 main.py 文件,内容如下:

import cc

class RunServerCommand(cc.Command):
    class flags:
        host = cc.FlagStr(flags=["--host"], description="server host.", default="0.0.0.0")
        port = cc.FlagInt(flags=["-p", "--port"], description="server port.", default=8080)
        log_level = cc.FlagStr(flags=["--log-level"], description="server log level.", default="info")

    def run(self, *args):
        print("server start")

class RunCronCommand(cc.Command):
    class flags:
        cron = cc.FlagStr(flags=["--cron"], description="cron like '* * * * *'.", require=True)
        log_level = cc.FlagStr(flags=["--log-level"], description="server log level.", default="info")

    def run(self, *args):
        print("cron start")

def main():
    cmd = cc.NewCommand()
    cmd.add(
        RunServerCommand(),
        RunCronCommand(),
    )
    cc.Execute(cmd)

if __name__ == '__main__':
    main()

在上述代码中,我们定义了两个指令:

  • RunServerCommand:启动后端服务。
  • RunCronCommand:启动后台定时任务。

这时,我们可以分别使用以下指令启动对应的服务:

  • python main.py runserver -p 8000:启动后端服务,并指定端口为8000.
  • python main.py runcron --cron "0 * * * *":启动定时服务,并指定cron参数.

命令组合

同样的命令参数,我们可以通过简单的改造,实现命令组合,然后通过下述方式启动:

  • python main.py run server -p 8000:启动后端服务,并指定端口为8000.
  • python main.py run cron --cron "0 * * * *":启动定时服务,并指定cron参数.
import cc

class RunCommand(cc.Command):

    def __init__(self):
        super().__init__()
        self.add(
            ServerCommand(),
            CronCommand(),
        )

class ServerCommand(cc.Command):
    class flags:
        host = cc.FlagStr(flags=["--host"], description="server host.", default="0.0.0.0")
        port = cc.FlagInt(flags=["-p", "--port"], description="server port.", default=8080)
        log_level = cc.FlagStr(flags=["--log-level"], description="server log level.", default="info")

    def run(self, *args):
        print("server start")

class CronCommand(cc.Command):
    class flags:
        cron = cc.FlagStr(flags=["--cron"], description="cron like '* * * * *'.", require=True)
        log_level = cc.FlagStr(flags=["--log-level"], description="server log level.", default="info")

    def run(self, *args):
        print("cron start")

def main():
    cmd = cc.NewCommand()
    cmd.add(
        RunCommand(),
    )
    cc.Execute(cmd)

if __name__ == '__main__':
    main()

Command属性

run

用于启动指令:

class ServerCommand(cc.Command):

    def run(self, *args):
        print("server start")

flags

用于定义命令行参数,启动后会读取sys.argv并填充至对应属性中。然后可以在run函数中进行调用,调用方法为value

class ServerCommand(cc.Command):

    class flags:
        host = cc.FlagStr(flags=["--host"], description="server host.", default="0.0.0.0")
        port = cc.FlagInt(flags=["-p", "--port"], description="server port.", default=8080)
        log_level = cc.FlagStr(flags=["--log-level"], description="server log level.", default="info")

    def run(self, *args):
        print("server start: ", self.flags.host.value())
        print("server start: ", self.flags.port.value())
        print("server start: ", self.flags.log_level.value())

entrypoints

用于指定启动指令,默认为小写的类名字,如果类名字以commandcmd结尾,则程序会帮你去掉。举例:

  • 定义类名HelloCommand,则entrypointshello
  • 定义类名HelloCmd,则entrypointshello
  • 定义类名HelloCC,则entrypointshellocc

我们可以通过自定义entrypoints方法实现覆盖,见下:

class ServerCommand(cc.Command):

    def entrypoints() -> str:
        return "server"

usages

用于描述命令使用方法,默认为[entrypoints] [OPTIONS]。可以通过自定义usages方法实现覆盖,见下:

class ServerCommand(cc.Command):

    def usages() -> str:
        return "run server [OPTIONS]"

descriptions

用于描述命令功能,默认为空。可以通过自定义descriptions方法实现覆盖,见下:

class ServerCommand(cc.Command):

    def descriptions() -> str:
        return "启动服务指令"

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages