python cmdln命令行终端持续运行模块使用教程

  • A+
所属分类:编程语言

Python命令行运行的解析库有多种,如:argarse、docopt、click、invoke等,其中Argarse为python内置标准库,使用较为频繁,但用起来也较为麻烦。下面折叠部分为几种模块的基本用法,如果有时间可以具体了解。今天要分享的是一个非常好用的命令行持续运行的库 cmdln,是在python内置模块cmd的基础上进一步封装的开源项目。

python cmdln命令行终端持续运行模块使用教程

 

一、cmdln库的优点

1.cmdln是在cmd模块基础上的封装,使用上和cmd一样简单,将函数名添加前缀do_即可实现函数通过命令行运行;

2.实现了类似Tkinter的mainloop方法,能够通过命令行单次执行,或多次执行,保持会话持续在终端运行,有点类似于ipython编辑器;

3.cmdln提供了方面便的函数解析功能,将命令参数进行自动解析,不需要重新造轮子编写参数解析函数;

4.有时代码中实现的函数命令功能较多,若手动整理有多少函数功能就会非常麻烦,cmdln库提供了一种方便的集成帮助,直接将所有函数进行整理并形成命令列表,方便查看有哪些命令及如何使用。同时,对每一个函数也提供了帮助信息,如:需要怎样使用该命令,需要哪些参数,每个参数是什么作用,最后的返回结果是什么等。

二、cmdln的使用方法

在了解cmdln使用之前先初步了解一下cmd模块的方法介绍及使用案例:

(1)cmdloop():类似与Tkinter的mainloop,运行Cmd解析器;

(2)onecmd(str):读取输入,并进行处理,通常不需要重载该函数,而是使用更加具体的do_command来执行特定的命令;

(3)emptyline():当输入空行时调用该方法;

(4)default(line):当无法识别输入的command时调用该方法;

(5)completedefault(text,line,begidx,endidx):如果不存在针对的complete_*()方法,那么会调用该函数,该函数主要是用于tab补充,且只能在linux下使用。

(6)precmd(line):命令line解析之前被调用该方法;

(7)postcmd(stop,line):命令line解析之后被调用该方法;

(8)preloop():cmdloop()运行之前调用该方法;

(9)postloop():cmdloop()退出之后调用该方法;

(10)help_command():对command命令的说明,其中command为可变字符

  1. from?cmd?import?Cmd
  2. import?os
  3. class?Client(Cmd):
  4. ????u"""help
  5. ????这是doc
  6. ????"""
  7. ????prompt?=?'pyFun>'
  8. ????intro?=?'Welcom?to?pyFun!'
  9. ????def?__init(self):
  10. ????????Cmd.__init__(self)
  11. ????def?do_hello(self,?arg):
  12. ????????print('hello',?arg)
  13. ????def?do_exit(self,?arg):
  14. ????????print('Bye!')
  15. ????????return?True??#?返回True,直接输入exit命令将会退出
  16. ????def?preloop(self):
  17. ????????print("print(this?line?before?entering?the?loop")
  18. ????def?postloop(self):
  19. ????????#?print('Bye!')
  20. ????????print("print?this?line?after?leaving?the?loop")
  21. ????def?precmd(self,?line):
  22. ????????print("print(this?line?before?do?a?command")
  23. ????????return?Cmd.precmd(self,?line)
  24. ????def?postcmd(self,?stop,?line):
  25. ????????print("print(this?line?after?do?a?command")
  26. ????????return?Cmd.postcmd(self,?stop,?line)
  27. if?__name__?==?'__main__':
  28. ????try:
  29. ????????os.system('cls')
  30. ????????client?=?Client()
  31. ????????client.cmdloop()
  32. ????except:
  33. ????????exit()

cmdln也与之类似,包括了alias命令别称,option命令参数,命令持续运行svn.main(loop=LOOP_ALWAYS)等,同时输入help 命令名 则可以输出对应该条命令的说明文档,

内置的说明文档变量有如下几个:

"${name}"            工具名称
"${option_list}"     参数列表
"${command_list}"    命令列表
"${help_list}"       参数帮助列表
"${cmd_name}"        命名名称
"${cmd_usage}"       命令帮助信息
"${cmd_option_list}" 命令参数信息列表
  1. import?sys
  2. import?cmdln
  3. class?MySVN(cmdln.Cmdln):
  4. ????name?=?"svn"
  5. ????@cmdln.alias("stat",?"st")
  6. ????@cmdln.option("-u",?"--show-updates",?action="store_true",
  7. ??????????????????help="display?update?information")
  8. ????@cmdln.option("-v",?"--verbose",?action="store_true",
  9. ??????????????????help="print?extra?information")
  10. ????def?do_status(self,?subcmd,?opts,?*paths):
  11. ????????"""${cmd_name}:?print?the?status?of?working?copy?files?and?directories
  12. ????????${cmd_usage}
  13. ????????${cmd_option_list}
  14. ????????"""
  15. ????????print("'svn?%s'?opts:??%s"?%?(subcmd,?opts))
  16. ????????print("'svn?%s'?paths:?%s"?%?(subcmd,?paths))
  17. if?__name__?==?"__main__":
  18. ????svn?=?MySVN()
  19. ????sys.exit(svn.main())

三、cmdln项目打包

通过cmdln库建立的项目可以通过pyinstaller进行打包成独立的exe文件,这样可以直接将exe文件分发给其他人使用,需要先通过pip installer pyinstaller ?安装pyinstaller,然后用cmd命令打开项目所在的入口文件目录中,pyinstaller -F example.py 即可将其打包成命名行工具了。

四、其他说明

cmdln相对来说较好使用,能够像ipython那样保持命令行终端会话持续运行,但是关于参数解析及提示的功能还是较弱,不过总体能满足命令行打包后持续运行的需求,若能够将cmd与click库进行结合就更好了。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: