CMD2-在Python中快速构建功能丰富、用户友好的交互式命令行应用程序
cmd2的Python项目详细描述
CMD2:构建交互式命令行应用程序的工具
CMD2是在Python中构建交互式命令行应用程序的工具。它的目标是 开发人员可以快速方便地构建功能丰富、用户友好的交互式命令行 应用。它提供了一个简单的api,它是python内置的扩展 cmd模块。CMD2在 使您的生活更轻松,并消除了许多样板代码,这将是必要的。 使用命令时。
主要功能
- 可搜索的命令历史记录(
历史记录
命令和<;ctrl>;+r
)-可选的持久性 - 使用
运行脚本
(@
)和相对运行脚本
(@
) 为应用程序编写文本文件脚本
- 使用run pyscript编写应用程序的python脚本
- 使用
运行shell命令!< /代码>
- 使用
- 将命令输出重定向到
>;
,>;
- 不带文件名的裸
>;
,>;
。结束输出到粘贴缓冲区(剪贴板) py
进入交互式python控制台(opt-inipy
用于ipython控制台)- 使用带有
cmd2.cmd.ppaged()
的寻呼机显示长输出的选项
- 多行命令
- 特殊字符命令快捷方式(超出命令的
?
和!
) - 命令别名类似于bash
alias
command - 宏,与别名类似,但它们可以包含参数占位符
- 从初始化脚本启动时运行命令的能力
- 可设置的环境参数
- 使用
argparse
分析带参数的命令,包括对子命令的支持 - Unicode字符支持
- 命令、子命令、文件系统路径和shell命令的良好制表符完成情况
- 当使用
cmd2
argparse
decorators之一时,自动完成argparse
标志的制表符 - 在Windows、MacOS和Linux上支持Python3.5+。
- 为所有命令提供内置帮助非常简单
- 应用程序的内置回归测试框架(基于文本的测试)
- 可从
history-t
或run-script-t
自动生成用于内置回归的脚本
- 当用户在提示下输入文本时无缝打印的警报
- 使用
ansi.style()
对输出进行着色和样式化
python 2.7支持为eol
支持Python2.7的CMD2的最后一个版本是于2018年8月21日发布的0.8.9。
支持python 2对我们有限的资源来说是一个越来越大的负担。切换到只支持python 3 我们将清理代码库,清除一些障碍,并专注于开发新功能。
安装
在所有操作系统上,都可以使用pip:
安装最新稳定版本的CMD2
。
pip install -U cmd2
CMD2在Windows、MacOS和Linux上与Python3.5+协同工作。它是纯python代码,很少有第三方依赖。
有关其他安装选项的信息,请参见 CMD2中的安装说明 文档。
文档
可在线阅读CMD2的最新文档:https://cmd2.readthedocs.io/en/latest/" rel="nofollow">https://cmd2.readthedocs.io/en/latest/
它有HTML、PDF和ePub格式。
功能概述
执行每个功能的说明如下。
扩展
cmd
模块。因此cmd
提供的功能仍然存在- 您的应用程序继承自
cmd2.cmd
,假设您调用这个类myapp
importcmd2classMyApp(cmd2.Cmd):pass
- 通过创建名为do-foo的方法定义名为foo的命令
classMyApp(cmd2.Cmd):defdo_foo(self,args):"""This docstring is the built-in help for the foo command."""self.poutput(cmd2.style('foo bar baz',fg='red'))
- 默认情况下,do foo方法的docstring是foo命令的帮助
- 注意:如果您使用下面提到的
argparse
decorators中的一个
- 注意:如果您使用下面提到的
- 可以通过创建一个help\u foo方法提供更多自定义帮助(使用
argparse
decorators时除外) - 可以通过创建complete\u foo方法为foo命令提供自定义制表符完成
- 很容易将现有的
cmd
app升级到cmd2
- 通过执行cmdloop方法,使用内置的repl运行
cmd2
应用程序
- 您的应用程序继承自
可搜索的命令历史记录
- 使用
<;ctrl>;+r
、箭头键和其他阅读线读取历史记录快捷键- readline history可以通过
cmd2.cmd的可选参数在应用程序运行之间持久化
- readline history可以通过
CMD2
历史记录
- 根据设计,此历史记录不会在应用程序运行之间保持
- 如果要从历史记录中排除某些自定义命令,请将它们的名称附加到
cmd.exclude\u from\u history的列表中
- 有关详细信息,请在任何
CMD2
应用程序中执行help history
- 使用
使用文本文件编写简单的脚本,每行一个命令+参数
- 有关详细信息,请参阅
CMD2
文档中的命令脚本部分。- 请参阅script.txt中的一个小示例脚本,它可以是 在任何带有"运行脚本"命令的
CMD2
应用程序中使用(或@
快捷方式) - 请参阅script.txt中的一个小示例脚本,它可以是 在任何带有"运行脚本"命令的
- 有关详细信息,请参阅
强大而灵活的内置python脚本,使用
run\u pyscript
命令编写应用程序脚本- 在
cmd2
应用程序中运行任意python脚本,并能够调用自定义cmd2
命令 - 没有供最终用户学习的单独api
- 在run pyscript中调用
cmd2
命令的语法基本上与在命令行中输入的语法相同
- 在run pyscript中调用
- 有关详细信息,请参阅
CMD2
文档中的python scripts部分 - 另请参见python脚本.py 示例与条件脚本结合使用
- 在
用
argparse解析命令
- 两个decorator提供了使用
argparse.argumentparser
解析命令参数的内置功能CMD2.with_argparser
-所有参数都由argumentparser解析
CMD2.with_argparser_and_unknown_args
-任何未由argumentparser分析的参数都将作为列表传递
importargparsefromcmd2importwith_argparserargparser=argparse.ArgumentParser()argparser.add_argument('-p','--piglatin',action='store_true',help='atinLay')argparser.add_argument('-s','--shout',action='store_true',help='N00B EMULATION MODE')argparser.add_argument('words',nargs='+',help='words to say')@with_argparser(argparser)defdo_speak(self,args):"""Repeats what you tell me to."""words=[]forwordinargs.words:ifargs.piglatin:word='%s%say'%(word[1:],word[0])ifargs.shout:word=word.upper()words.append(word)self.stdout.write('{}\n'.format(' '.join(words)))
有关详细信息,请参见文档中的参数处理。
注意:
CMD2
还提供CMD2ArgumentParser
自定义的ArgumentParser.ArgumentParser 帮助和错误信息。
- 两个decorator提供了使用
CMD2
应用程序在许多方面都像一个功能齐全的shell(而且是跨平台的)- 在任意shell命令前面加上
!
或外壳
- 将任何命令的输出重定向到具有用于覆盖的
>;
或用于追加的>;
的文件- 如果在
>;
/>;
之后没有提供文件名,则输出将转到剪贴板/pastebuffer
- 如果在
- 使用
- 使用
别名
命令创建自己的自定义命令别名 - 使用
宏
命令创建自己的自定义宏(类似于别名,但允许参数) - 可设置的环境参数,用户可以在执行期间通过
set
命令更改这些参数 - 使用带有
cmd2.cmd.ppaged()
的寻呼机显示长输出的选项
opTionally指定一个启动脚本,最终用户可以使用该脚本自定义其环境 - 在任意shell命令前面加上
一流的制表符完成功能,易于使用,但功能非常强大
- 对于命令foo实现complete\u foo方法来为该命令提供自定义的制表符完成
- 但下面讨论的
CMD2
中的helper方法意味着您几乎不必从头开始实现它。
- 但下面讨论的
- 使用
argparse
decorator之一的命令具有argparse
标志的自动制表符完成- 并为与这些标志相关联的值提供帮助提示
- 尝试使用arg print.py示例 使用oprint和pprint命令了解其工作原理
path\u complete
helper方法提供文件系统路径的灵活制表符完成- 有关简单的用例,请参见paged_output.py示例
- 有关更全面的用例,请参见python_scripting.py示例
基于标志的完成
基于令牌完成之前的特定标志的制表符完成的助手方法- 有关如何使用此功能的演示,请参见tab_completion.py示例
基于索引的完成
基于输入字符串中固定位置的制表符完成的助手方法- 有关如何使用此功能的演示,请参见tab_completion.py示例
basic\u complete
tab completion对列表的帮助方法分隔符完成
- 有关如何使用此功能的演示,请参见tab廑autocompletion.py示例
CMD2
结合argparse
还提供了一些自动完成制表符的高级功能 -有关详细信息,请参见tab_autocompletion.py示例
多行命令
任何命令在其名称被列出时都接受多行输入
cmd2.cmd.\u初始化
。程序将一直等待输入,直到一行以
终止符
是cmd2.cmd.\uu init\uuuu()的可选参数
。默认终止符是;
和\n
(空换行符)。
特殊字符快捷命令(超出命令行"@"和"!")
要为命令创建单个字符的快捷方式,请更新cmd.shortcuts
基于后台线程中发生的事件的异步警报
CMD2
提供了以下帮助程序方法,用于向用户异步提供信息,即使CMD2
REPL是一个面向行的命令解释器:异步警报
-在命令之间的提示下向用户显示重要消息- 对用户来说,它看起来就像提示上方打印了一条警告消息
异步更新提示
-当用户还在输入时更新提示- 这有助于提醒用户在命令之间动态更改系统
设置窗口标题
-设置终端窗口标题- 这将更改用户在其中运行
CMD2
应用程序的终端的窗口标题。
- 这将更改用户在其中运行
教程
示例应用程序
示例CMD2应用程序(examples/example.py):
#!/usr/bin/env python# coding=utf-8"""A sample application for cmd2."""importargparseimportrandomimportsysimportcmd2classCmdLineApp(cmd2.Cmd):""" Example cmd2 application. """# Setting this true makes it run a shell command if a cmd2/cmd command doesn't exist# default_to_shell = TrueMUMBLES=['like','...','um','er','hmmm','ahh']MUMBLE_FIRST=['so','like','well']MUMBLE_LAST=['right?']def__init__(self):self.maxrepeats=3shortcuts=dict(cmd2.DEFAULT_SHORTCUTS)shortcuts.update({'&':'speak'})# Set use_ipython to True to enable the "ipy" command which embeds and interactive IPython shellsuper().__init__(use_ipython=False,multiline_commands=['orate'],shortcuts=shortcuts)# Make maxrepeats settable at runtimeself.settable['maxrepeats']='max repetitions for speak command'speak_parser=argparse.ArgumentParser()speak_parser.add_argument('-p','--piglatin',action='store_true',help='atinLay')speak_parser.add_argument('-s','--shout',action='store_true',help='N00B EMULATION MODE')speak_parser.add_argument('-r','--repeat',type=int,help='output [n] times')speak_parser.add_argument('words',nargs='+',help='words to say')@cmd2.with_argparser(speak_parser)defdo_speak(self,args):"""Repeats what you tell me to."""words=[]forwordinargs.words:ifargs.piglatin:word='%s%say'%(word[1:],word[0])ifargs.shout:word=word.upper()words.append(word)repetitions=args.repeator1foriinrange(min(repetitions,self.maxrepeats)):# .poutput handles newlines, and accommodates output redirection tooself.poutput(' '.join(words))do_say=do_speak# now "say" is a synonym for "speak"do_orate=do_speak# another synonym, but this one takes multi-line inputmumble_parser=argparse.ArgumentParser()mumble_parser.add_argument('-r','--repeat',type=int,help='how many times to repeat')mumble_parser.add_argument('words',nargs='+',help='words to say')@cmd2.with_argparser(mumble_parser)defdo_mumble(self,args):"""Mumbles what you tell me to."""repetitions=args.repeator1foriinrange(min(repetitions,self.maxrepeats)):output=[]if(random.random()<.33):output.append(random.choice(self.MUMBLE_FIRST))forwordinargs.words:if(random.random()<.40):output.append(random.choice(self.MUMBLES))output.append(word)if(random.random()<.25):output.append(random.choice(self.MUMBLE_LAST))self.poutput(' '.join(output))if__name__=='__main__':app=CmdLineApp()sys.exit(app.cmdloop())
下面是运行example.py的示例会话。 由于CMD2的内置转录测试功能,它还可以作为一个测试 当保存为transcript_regex.txt时,例如suite.py。 运行< > >
python example.py -t transcript_regex.txt
将对example.py
运行脚本中的所有命令,验证生成的输出
与成绩单匹配。
示例/transcript_regex.txt:
# Run this transcript with "python example.py -t transcript_regex.txt" # The regex for editor will match whatever program you use. # regexes on prompts just make the trailing space obvious (Cmd) set allow_ansi: Terminal continuation_prompt: >/ / debug: False echo: False editor: /.*?/ feedback_to_output: False locals_in_py: True maxrepeats: 3 prompt: (Cmd)/ / quiet: False timing: False
正则表达式可以在转录文件中的任何位置使用,只需将它们括在正斜杠中,/
找到虫子了吗?
如果您认为您发现了一个bug,请首先阅读打开的问题。如果您确信这是一个新的bug,请继续创建一个新的github问题。请确保包含尽可能多的信息,以便我们可以重现错误。请至少说明以下内容:
CMD2
版本- python版本
- 操作系统名称和版本
- 你做了什么导致错误发生
- 包括与错误相关的任何回溯或错误消息
使用CMD2的开源项目
下面是一些使用CMD2
的开源项目示例:
- cepfs外壳
- ceph是一个分布式对象、块和文件存储平台
- jsshell
- 交互式多用户web javascript外壳
- psiturk
- 亚马逊Mechanical Turk科学开放平台
- jok3r
- 网络和Web Pentest自动化框架
- 波塞冬
- 利用软件定义的网络(SDN)获取网络流量,然后将网络流量馈送给许多机器学习技术
- 统一打包机
- 基于仿真的Windows二进制文件自动和独立于平台的解包程序
- 闪灯
- 基于启发式的swf文件自动分析。可通过插件扩展。
- tomcatmanager
- 用于管理tomcat服务器的命令行工具和python库
- 外植体
- 物联网开发框架
- mptcanalyzer
- 帮助分析MPTCP PCAP的工具
- clanvas
-
通过指令为Canvas指令线路客户端