HiveNetConsole模块说明¶
HiveNetConsole是简单的命令行执行框架,可在该框架上基于yaml配置文件扩展增加不同的命令支持,主要特点如下:
支持yaml配置不同命令扩展;
支持多国语言显示;
进入控制台可支持命令提示;
支持直接在shell中执行命令,以及执行批量命令文件;
跨平台;
开发命令行应用的步骤¶
开发命令执行函数¶
直接实现命令执行函数¶
您可以直接实现命令执行函数,只要函数的输入和返回值满足以下要求即可:
1、函数格式为 cmd_deal_fun(message=’’, cmd=’’, cmd_para=’’, prompt_obj=None, **kwargs) -> CResult
2、入参说明如下:
message : prompt提示信息
cmd : 执行的命令key值
cmd_para : 传入的命令参数(命令后的字符串, 去掉第一个空格)
prompt_obj : 传入调用函数的PromptPlus对象, 可以通过该对象的一些方法控制输出显示
kwargs : 如果实现类是继承了CmdBaseFW, 则是传入实例化的kwargs参数
3、返回值为CResult, 可通过返回错误码10101通知框架退出命令行, 同时也可以通过CResult对象的print_str属性要求框架进行打印处理。
例如:
# 直接在模块中定义执行函数
def deal_func_on_main(message='', cmd='', cmd_para='', prompt_obj=None, **kwargs) -> CResult:
# 执行处理逻辑
...
# 返回结果
return CResult(code='00000')
# 在类中定义执行函数
class CmdFuns(object):
def __init__(self, **kwargs):
...
# 静态函数调用
@classmethod
def deal_func_class_static(cls, message='', cmd='', cmd_para='', prompt_obj=None, **kwargs) -> CResult:
# 执行处理逻辑
...
# 返回结果
return CResult(code='00000')
# 实例函数调用
def deal_func_class_static(self, message='', cmd='', cmd_para='', prompt_obj=None, **kwargs) -> CResult:
# 执行处理逻辑
...
# 返回结果
return CResult(code='00000')
继承CmdBaseFW开发扩展命令类1(一个类支持一个命令执行)¶
可以基于CmdBaseFW自行开发扩展命令,示例如下:
from HiveNetCore.generic import CResult
from HiveNetCore.i18n import _
from HiveNetConsole.base_cmd import CmdBaseFW
class YourClass(CmdBaseFW):
#############################
# 需具体实现类覆盖实现的类
#############################
def _init(self, **kwargs):
"""
实现类需要覆盖实现的初始化函数
@param {kwargs} - 传入初始化参数字典(config.xml的init_para字典)
@throws {exception-type} - 如果初始化异常应抛出异常
"""
您的自定义初始化内容...
def _cmd_dealfun(self, message='', cmd='', cmd_para='', prompt_obj=None, **kwargs):
"""
实现类需要覆盖实现的命令处理函数
@param {string} message='' - prompt提示信息
@param {string} cmd - 执行的命令key值
@param {string} cmd_para - 传入的命令参数(命令后的字符串,去掉第一个空格)
@param {PromptPlus} prompt_obj=None - 传入调用函数的PromptPlus对象,可以通过该对象的一些方法控制输出显示
@param {kwargs} - 传入的主进程的初始化kwargs对象
shell_cmd {bool} - 如果传入参数有该key,且值为True,代表是命令行直接执行,非进入控制台执行
@returns {CResult} - 命令执行结果,可通过返回错误码10101通知框架退出命令行, 同时也可以通过CResult对象的print_str属性要求框架进行打印处理
"""
您自己的处理函数内容
关注点如下:
通过 self._console_global_para 可以获取命令行框架的公共变量,有用的公共变量包括:
execute_file_path :您的应用程序主目录
work_path : 工作目录,也就是启动命令行的当前目录
框架会自动加载i18n控件作为全局多国语言控件,您可以通过”from HiveNetCore.i18n import _”载入方法,并在您的应用打印时进行多国语言转换,具体用法参考simple_i18n的手册
您可以在一个类中实现多个命令函数,自行通过“_cmd_dealfun”做逻辑路由即可,可以参考“HiveNetConsole.base_cmd.CommonCmd”的方法
“cmd”和“cmd_para” 两个参数将输入的命令传给执行函数;
继承CmdBaseFW开发扩展命令类2(一个类支持多个命令执行)¶
由于命令配置只支持配置到类,框架会直接执行 _cmd_dealfun 函数来处理命令,因此通常开发以一个类执行一个命令的方式处理。但如果需要一个类支持多个命令,可以采取以下方式进行扩展:
from HiveNetCore.generic import CResult
from HiveNetCore.i18n import _
from HiveNetConsole.base_cmd import CmdBaseFW
class YourClass(CmdBaseFW):
#############################
# 需具体实现类覆盖实现的类
#############################
def _init(self, **kwargs):
"""
实现类需要覆盖实现的初始化函数
@param {kwargs} - 传入初始化参数字典(config.xml的init_para字典)
@throws {exception-type} - 如果初始化异常应抛出异常
"""
# 自定义初始化函数中设置命令的映射关系,并且请不要重载 _cmd_dealfun 函数
self._CMD_DEALFUN_DICT = {
'cmd1': self._my_cmd_dealfun1,
'cmd2': self._my_cmd_dealfun2,
}
def _my_cmd_dealfun1(self, message='', cmd='', cmd_para='', prompt_obj=None, **kwargs):
"""
自定义命令处理函数
@param {string} message='' - prompt提示信息
@param {string} cmd - 执行的命令key值
@param {string} cmd_para - 传入的命令参数(命令后的字符串,去掉第一个空格)
@param {PromptPlus} prompt_obj=None - 传入调用函数的PromptPlus对象,可以通过该对象的一些方法控制输出显示
@param {kwargs} - 传入的主进程的初始化kwargs对象
shell_cmd {bool} - 如果传入参数有该key,且值为True,代表是命令行直接执行,非进入控制台执行
@returns {CResult} - 命令执行结果,可通过返回错误码10101通知框架退出命令行, 同时也可以通过CResult对象的print_str属性要求框架进行打印处理
"""
您自己的处理函数内容
def _my_cmd_dealfun2(self, message='', cmd='', cmd_para='', prompt_obj=None, **kwargs):
"""
自定义命令处理函数
@param {string} message='' - prompt提示信息
@param {string} cmd - 执行的命令key值
@param {string} cmd_para - 传入的命令参数(命令后的字符串,去掉第一个空格)
@param {PromptPlus} prompt_obj=None - 传入调用函数的PromptPlus对象,可以通过该对象的一些方法控制输出显示
@param {kwargs} - 传入的主进程的初始化kwargs对象
shell_cmd {bool} - 如果传入参数有该key,且值为True,代表是命令行直接执行,非进入控制台执行
@returns {CResult} - 命令执行结果,可通过返回错误码10101通知框架退出命令行, 同时也可以通过CResult对象的print_str属性要求框架进行打印处理
"""
您自己的处理函数内容
开发命令执行函数的技巧¶
解析并获取命令行参数¶
命令函数中可自行解析cmd_para来获取命令行传入的不同参数,更简便的方式是通过内置的 self._cmd_para_to_dict 函数来进行参数解析,来更快速地获取到所需的参数,例如:
# 示例: cmd_para = 'name1=name1_val name2=name2_val -n1 n1_val -n2 val3 val4'
_para_dict = self._cmd_para_to_dict(cmd_para, name_with_sign=False)
...
所得到的_para_dict值为:
{
'name1': 'name1_val', 'name2': 'name2_val', # 长名字参数, key=value 模式
'n1': 'n1_val', 'n2': '', # 短名字参数, -p value 模式
'{para}1': 'val3', '{para}2': 'val4' # 无名字参数, key为'{para}序号', value为参数值
}
部署您的应用目录¶
1、请将HiveNetConsole下的“conf/config.yaml”复制到您的应用目录下,例如”/yourapp/conf/config.yaml”;当然您也可以放到不同目录或指定不同文件名,但这样后续需要有些特殊的编码处理;
2、在应用目录下创建 “i18n”目录用于放置多国语言文件;您也可以放到不同目录下,但需要修改config.yaml中的 “i18n” 配置指定目录;
3、创建多国语言文件,不同语言的文件名为”message_语言标识.json”,例如”message_en.json”,翻译样式非常简单,就是类似以下格式的json字符串, 详细信息请参考HiveNetCore.i18n的手册:
{
"'$1' is not support command!": "控制台不支持 '$1' 命令!",
"You will shutdown $1 Console, continue?(y/N)": "您将关闭 $1 控制台,请确认是否继续(y/N)?",
"Exit $1 Console": "退出 $1 控制台",
"Cancel Exit": "取消退出操作"
}
4、创建一个用于启动控制台的py文件(例如console.py),用于执行启动操作,代码非常简单:
import sys
import os
from HiveNetCore.utils.file_tool import FileTool
from HiveNetConsole import ConsoleServer
def main(**kwargs):
ConsoleServer.console_main(
execute_file_path=os.path.realpath(FileTool.get_file_path(__file__)),
**kwargs
)
if __name__ == '__main__':
main()
注:如果您希望将config放到不同目录,请在console_main函数传入default_config_file参数。
配置应用命令¶
1、所有配置都在config.yaml中,一些显示的配置项如下:
console > name : 您的应用名称,在帮助文本中可以通过 {{NAME}} 进行替换
console > version : 应用版本, 在帮助文本中可以通过 {{VERSION}} 进行替换
console > shell_cmd_name: 您的程序建立的系统软连接名称, 在帮助文本中可以通过 {{SHELL_CMD_NAME}} 进行替换
console > message : 控制台前面显示的提示符
2、将您的扩展命令配置到框架中,您需要在“console > cmd_list”下新增相应的数组值,例如:
-
... # 其他配置
-
command: mdtowiki
module_name: mediawikiTool.lib.mediawiki_cmd # 注意如果这样配置需要安装mediawikiTool包到python中
class: MediaWikiCmd
function: cmd_dealfun # 如果是继承CmdBaseFW的实现,则固定为cmd_dealfun,否则为对应的函数名
instantiation: true
cmd_para |-
{
"long_para": {
"in": [],
"out": [],
"name": [],
"stdpic": []
}
}
help: |-
{
"en": [
"convert markdown file to mediawiki format",
"",
"mdtowiki -in file [-out outpath] [-name title] [-stdpic]",
" -in : Markdown file path (include filename), if just filename then search on the current working directory",
" -out : the MediaWiki file output path, If not specified to represent output on the current working directory",
" -name : MediaWiki page title, If you do not specify the filename that represents the use of Markdown filename (without the extension)",
" -stdpic : Set this parameter to automatically rename the pictures in order;Otherwise it will be named after the original file name",
"",
"demo: mdtowiki -in mdtowiki.md",
""
],
"zh_cn": [
"将markdown格式文件转换为mediawiki格式",
"",
"mdtowiki -in file [-out outpath] [-name title] [-stdpic]",
" -in : Markdown文件路径(含名称), 如果在当前工作目录下可以只输入名称",
" -out : 要输出的MediaWiki文件路径, 如果不指定代表输出在当前工作目录上",
" -name : MediaWiki标题名字,如果不指定代表使用Markdown的文件名(不含扩展名)",
" -stdpic : 设置该参数可以自动将图片按顺序重命名; 否则将按原文件名命名",
"",
"示例: mdtowiki -in mdtowiki.md",
""
]
}
说明如下:
“command ” 是命令字符,及在命令行中输入的最前面的词
加载执行函数的说明可参考配置文件中的 “通用说明: 动态加载的命令函数通用配置”
“cmd_para” 是命令提示的参数,格式可参考prompt_plus
{ # 名字参数 para1=value11 形式, 数组为可选值 'name_para': { 'para1': ['value11', 'value12'], 'para2': ['value21', 'value22'] }, # 短参数(单字母) -a value1a 形式, 数组为可选值, None代表不带参数 'short_para': { 'a': ['value1a', 'value2a'], 'b': None, 'c': [] }, # 长参数(多字母) -abc value1abc 形式, 与短参数相似 'long_para': { 'abc': ['value1abc', 'value2abc'], 'bcd': None, 'ci': [] }, # 单词参数, 直接只有参数值, 参数之间用空格间隔 'word_para': { 'help': '', 'start': '' } }
“help” 是命令的帮助,如上例,可以设置多语言的支持
3、如果您希望不使用”python console.py”这种方式执行,可以修改您的setup.py文件,增加以下参数,让安装的时候直接建立软连接,如以下示例,会建立一个wikitool的软连接直接启动程序,连接到console.py的main函数执行:
# 示例
entry_points={'console_scripts': [
"wikitool = mediawikiTool.console:main"
]},
修改命令行配色方案¶
通过修改config.xml配置文件可以改变命令行展现的不同特性,其中一个比较关键的配置是修改命令行配色方案,如果遇到命令需要在不同颜色主题的命令行中执行,默认的配色方案可能有问题,这时候就需要修改配色方案来保证字体输出能清晰看到,可以修改配置中的 color_set 参数调整配色方案:
color_set : 命令行配色方案,如果采用默认方案可不传,每个配色格式类似为'#000088 bg:#aaaaff underline'
input : 用户输入,默认为'#F2F2F2'
cmd : 命令,默认为'#13A10E'
name_para : key-value形式参数名, 默认为'#C19C00'
short_para: -char形式的短参数字符, 默认为'#3B78FF'
long_para: -name形式的长参数字符,默认为'#FFFF00'
word_para: word 形式的词字符,默认为'#C19C00', # word 形式的词字符
wrong_tip: 错误的命令或参数名提示,默认为'#FF0000 bg:#303030', 也可以参考格式:#ff0000 bg:#ffffff reverse
prompt: prompt提示信息,默认为'#F2F2F2'
示例:
...
color_set:
# 设置为空让字体能同时适应黑白背景 -->
input: ""
prompt: ""
...
使用HiveNetConsole框架¶
1、执行上例中实现的console.py,将进入控制台进行命令的执行,该方式的好处是可以有命令提示;
2、可以通过传入参数直接在shell中执行内部的命令,具体方式可使用”python console.py help=y”查看。