Python编程编写完善的命令行工具


Posted in Python onSeptember 15, 2021

1. python-fire

python-fire 是一个三方库,可以将任何 Python 对象变成一个命令行接口。

使用前先 pip install fire 下。

可以把你的函数直接变成命令行接口:

import fire
def hello(name="World"):
  return "Hello %s!" % name
if __name__ == '__main__':
  fire.Fire(hello)

然后在命令行,就可以执行这些命令:

python hello.py  # Hello World!
python hello.py --name=David  # Hello David!
python hello.py --help  # Shows usage information.

也可以把可以把你的类直接变成命令行接口:

import fire
class Calculator(object):
  """A simple calculator class."""
  def double(self, number):
    return 2 * number
if __name__ == '__main__':
  fire.Fire(Calculator)

然后就可以这样执行:

python calculator.py double 10  # 20
python calculator.py double --number=15  # 30

除此之外,还有这样的功能:

执行后自动进入交互模式:

command -- --interactive

比如:

Python编程编写完善的命令行工具

查看执行的调用顺序:

python arg_demo2.py double 10 -- --trace

结果如下:

Python编程编写完善的命令行工具

还可以为你生成 shell 自动补全命令的脚本,真的很贴心:

python arg_demo2.py double 10 -- --completion

2. mando

mando 是一个基于 argparse 的装饰器,可以让你在几秒内编写出一个灵活、可维护的命令行工具。

使用前先 pip install mando 下。

用法:

example.py

from mando import command, main
@command
def echo(text, capitalize=False):
    '''Echo the given text.'''
    if capitalize:
        text = text.upper()
    print(text)
if __name__ == '__main__':
    main()

命令行用法:

$ python example.py -h
usage: example.py [-h] {echo} ...
positional arguments:
  {echo}
    echo      Echo the given text.
optional arguments:
  -h, --help  show this help message and exit
$ python example.py echo -h
usage: example.py echo [-h] [--capitalize] text
Echo the given text.
positional arguments:
  text
optional arguments:
  -h, --help    show this help message and exit
  --capitalize

真实执行结果:

$ python example.py echo spam
spam
$ python example.py echo --capitalize spam
SPAM

再复杂一点的:

from mando import command, main
@command
def push(repository, all=False, dry_run=False, force=False, thin=False):
    '''Update remote refs along with associated objects.
    :param repository: Repository to push to.
    :param --all: Push all refs.
    :param -n, --dry-run: Dry run.
    :param -f, --force: Force updates.
    :param --thin: Use thin pack.'''
     print ('Pushing to {0}. All: {1}, dry run: {2}, force: {3}, thin: {4}'
           .format(repository, all, dry_run, force, thin))
if __name__ == '__main__':
    main()

mando 可以理解 Sphinx 风格的文档字符串中的 :param 参数说明,因此可以显示帮助文档。

$ python git.py push -h
usage: git.py push [-h] [--all] [-n] [-f] [--thin] repository
Update remote refs along with associated objects. 
positional arguments:
  repository     Repository to push to.
optional arguments:
  -h, --help     show this help message and exit
  --all          Push all refs.
  -n, --dry-run  Dry run.
  -f, --force    Force updates.
  --thin         Use thin pack.
 

mando 还可以理解 Python3 的类型提示,因此传错了参数,也会有报错提示:

from mando import command, main
@command
def duplicate(string, times: int):
    '''Duplicate text.
    :param string: The text to duplicate.
    :param times: How many times to duplicate.'''
    print(string * times)
if __name__ == '__main__':
    main()

执行:

$ python3 test.py duplicate "test " 5
test test test test test
$ python3 test.py duplicate "test " foo
usage: test.py duplicate [-h] string times
test.py duplicate: error: argument times: invalid int value: 'foo'

最后的话

本文分享编写建命令行工具的三方库,使用起来非常简单,我也是偶然在 GitHub 搜索到的,写代码前先在 GitHub 上搜一下真的是一个很好的习惯,以上就是Python编程编写完善的命令行工具的详细内容,更多关于Python编写完善的命令行工具的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
win7安装python生成随机数代码分享
Dec 27 Python
python实现分析apache和nginx日志文件并输出访客ip列表的方法
Apr 04 Python
用Python操作字符串之rindex()方法的使用
May 19 Python
python获取网页中所有图片并筛选指定分辨率的方法
Mar 31 Python
利用python GDAL库读写geotiff格式的遥感影像方法
Nov 29 Python
如何更优雅地写python代码
Jul 02 Python
Python3进制之间的转换代码实例
Aug 24 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
Sep 02 Python
python生成器用法实例详解
Nov 22 Python
Python日志syslog使用原理详解
Feb 18 Python
在Django中自定义filter并在template中的使用详解
May 19 Python
python学习将数据写入文件并保存方法
Jun 07 Python
python可视化之颜色映射详解
python的变量和简单数字类型详解
Sep 15 #Python
深入浅析Django MTV模式
python 进阶学习之python装饰器小结
Sep 04 #Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 #Python
关于python爬虫应用urllib库作用分析
解决pycharm下载库时出现Failed to install package的问题
You might like
php使用strtotime和date函数判断日期是否有效代码分享
2013/12/25 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
Laravel 中获取上一篇和下一篇数据
2015/07/27 PHP
Zend Framework缓存Cache用法简单实例
2016/03/19 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
巧妙破除网页右键禁用的十大绝招
2006/08/12 Javascript
Javascript-Mozilla和IE中的一个函数直接量的问题
2007/01/09 Javascript
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
对xmlHttp对象的理解
2011/01/17 Javascript
JavaScript高级程序设计 读书笔记之九 本地对象Array
2012/02/27 Javascript
js动态修改表格行colspan列跨度的方法
2015/03/30 Javascript
jQuery实现连续动画效果实例分析
2015/10/09 Javascript
javascript Slip.js实现整屏滑动的手机网页
2015/11/25 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
JavaScript、C# URL编码、解码总结
2017/01/21 Javascript
原生node.js案例--前后台交互
2017/02/20 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
关于jquery layui弹出层的使用方法
2018/04/21 jQuery
JS中创建自定义类型的常用模式总结【工厂模式,构造函数模式,原型模式,动态原型模式等】
2019/01/19 Javascript
初步解析Python中的yield函数的用法
2015/04/03 Python
python实现csv格式文件转为asc格式文件的方法
2018/03/23 Python
python实现自动登录后台管理系统
2018/10/18 Python
pandas通过loc生成新的列方法
2018/11/28 Python
Python 类的魔法属性用法实例分析
2019/11/21 Python
简述python&pytorch 随机种子的实现
2020/10/07 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
Watchshop德国:欧洲在线手表No.1
2019/06/20 全球购物
开发中都用到了那些设计模式?用在什么场合?
2014/08/21 面试题
幼儿园三八妇女节活动方案
2014/03/11 职场文书
乡镇四风对照检查材料
2014/08/31 职场文书
中学生旷课检讨书500字
2014/10/29 职场文书
2016年秋季运动会通讯稿
2015/11/25 职场文书
初二英语教学反思
2016/02/15 职场文书
如何利用opencv判断两张图片是否相同详解
2021/07/07 Python