CMD2-在Python中快速构建功能丰富、用户友好的交互式命令行应用程序

cmd2的Python项目详细描述


CMD2:构建交互式命令行应用程序的工具

最新版本生成状态appveyor生成状态azure生成状态codecovdocumentation statuschat

CMD2是在Python中构建交互式命令行应用程序的工具。它的目标是 开发人员可以快速方便地构建功能丰富、用户友好的交互式命令行 应用。它提供了一个简单的api,它是python内置的扩展 cmd模块。CMD2在 使您的生活更轻松,并消除了许多样板代码,这将是必要的。 使用命令时。

单击下面的图片观看演示CMD2功能的简短视频: screenshot

主要功能

  • 可搜索的命令历史记录(历史记录命令和<;ctrl>;+r)-可选的持久性
  • 使用运行脚本@)和相对运行脚本@
  • 为应用程序编写文本文件脚本
  • 使用run pyscript编写应用程序的python脚本
  • 使用运行shell命令!< /代码>
  • 使用
  • 将命令输出到shell命令
  • 将命令输出重定向到>;>;
  • 不带文件名的裸>;>;。结束输出到粘贴缓冲区(剪贴板)
  • py进入交互式python控制台(opt-inipy用于ipython控制台)
  • 使用带有cmd2.cmd.ppaged()
  • 的寻呼机显示长输出的选项
  • 多行命令
  • 特殊字符命令快捷方式(超出命令的
  • 命令别名类似于bashaliascommand
  • 宏,与别名类似,但它们可以包含参数占位符
  • 从初始化脚本启动时运行命令的能力
  • 可设置的环境参数
  • 使用argparse分析带参数的命令,包括对子命令的支持
  • Unicode字符支持
  • 命令、子命令、文件系统路径和shell命令的良好制表符完成情况
  • 当使用cmd2argparsedecorators之一时,自动完成argparse标志的制表符
  • 在Windows、MacOS和Linux上支持Python3.5+。
  • 为所有命令提供内置帮助非常简单
  • 应用程序的内置回归测试框架(基于文本的测试)
  • 可从history-trun-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命令的帮助
      • 注意:如果您使用下面提到的argparsedecorators中的一个
    • 可以通过创建一个help\u foo方法提供更多自定义帮助(使用argparsedecorators时除外)
    • 可以通过创建complete\u foo方法为foo命令提供自定义制表符完成
    • 很容易将现有的cmdapp升级到cmd2
    • 通过执行cmdloop方法,使用内置的repl运行cmd2应用程序
  • 可搜索的命令历史记录

    • 使用<;ctrl>;+r、箭头键和其他阅读线读取历史记录快捷键
      • readline history可以通过cmd2.cmd的可选参数在应用程序运行之间持久化
    • CMD2历史记录
      • 根据设计,此历史记录不会在应用程序运行之间保持
      • 如果要从历史记录中排除某些自定义命令,请将它们的名称附加到cmd.exclude\u from\u history的列表中
      • 有关详细信息,请在任何CMD2应用程序中执行help history
  • 使用文本文件编写简单的脚本,每行一个命令+参数

  • 强大而灵活的内置python脚本,使用run\u pyscript命令编写应用程序脚本

  • 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 帮助和错误信息。

  • CMD2应用程序在许多方面都像一个功能齐全的shell(而且是跨平台的)

    • 在任意shell命令前面加上外壳
    • 将任何命令的输出重定向到具有用于覆盖的>;或用于追加的>;的文件
      • 如果在>;/>;之后没有提供文件名,则输出将转到剪贴板/pastebuffer
    • 使用
    • 将任何命令的输出管道化为任意shell命令
    • 使用别名命令创建自己的自定义命令别名
    • 使用命令创建自己的自定义宏(类似于别名,但允许参数)
    • 可设置的环境参数,用户可以在执行期间通过set命令更改这些参数
    • 使用带有cmd2.cmd.ppaged()
    • 的寻呼机显示长输出的选项 opTionally指定一个启动脚本,最终用户可以使用该脚本自定义其环境
  • 一流的制表符完成功能,易于使用,但功能非常强大

    • 对于命令foo实现complete\u foo方法来为该命令提供自定义的制表符完成
      • 但下面讨论的CMD2中的helper方法意味着您几乎不必从头开始实现它。
    • 使用argparsedecorator之一的命令具有argparse标志的自动制表符完成
      • 并为与这些标志相关联的值提供帮助提示
      • 尝试使用arg print.py示例 使用oprintpprint命令了解其工作原理
    • path\u completehelper方法提供文件系统路径的灵活制表符完成
    • 基于标志的完成基于令牌完成之前的特定标志的制表符完成的助手方法
    • 基于索引的完成基于输入字符串中固定位置的制表符完成的助手方法
    • basic\u completetab completion对列表的帮助方法
    • 分隔符完成
    • 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指令线路客户端

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何将springboot war部署到debian jetty8   java破坏了函数,即使它看起来是正确的   当MockMvc不可自动编译时,java会有选择地从Spring Security向其应用单个过滤器   java AndroidStudio每秒播放n次生成的声音   JavaJBossSeam:继承的方法被拦截了吗?   ScheduledExecutorService中线程默认名称中池号的java含义   在Java中用递归方法实现类Fibonacci的递归   java虚拟路径/文件夹   java即时与ZoneDateTime。转换到另一时区   用GaussLegendre算法在java中逼近Pi   java RecyclerView findFirstVisibleItemPosition()返回1   java根据当前经过身份验证的用户的角色返回不同的JSON对象   java从内部类访问扩展类的方法   Android程序中的Java语法WRT静态方法   可选参数初始化Java字符串文字时出错