一个用于替代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()用于启动指令:
class ServerCommand(cc.Command):
def run(self, *args):
print("server start")用于定义命令行参数,启动后会读取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())用于指定启动指令,默认为小写的类名字,如果类名字以command、cmd结尾,则程序会帮你去掉。举例:
- 定义类名
HelloCommand,则entrypoints为hello - 定义类名
HelloCmd,则entrypoints为hello - 定义类名
HelloCC,则entrypoints为hellocc
我们可以通过自定义entrypoints方法实现覆盖,见下:
class ServerCommand(cc.Command):
def entrypoints() -> str:
return "server"用于描述命令使用方法,默认为[entrypoints] [OPTIONS]。可以通过自定义usages方法实现覆盖,见下:
class ServerCommand(cc.Command):
def usages() -> str:
return "run server [OPTIONS]"用于描述命令功能,默认为空。可以通过自定义descriptions方法实现覆盖,见下:
class ServerCommand(cc.Command):
def descriptions() -> str:
return "启动服务指令"