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 相关文章推荐
深入源码解析Python中的对象与类型
Dec 11 Python
深入了解Python数据类型之列表
Jun 24 Python
用Python将一个列表分割成小列表的实例讲解
Jul 02 Python
opencv python 傅里叶变换的使用
Jul 21 Python
详解python执行shell脚本创建用户及相关操作
Apr 11 Python
使用python 对验证码图片进行降噪处理
Dec 18 Python
python支持多继承吗
Jun 19 Python
基于Python和C++实现删除链表的节点
Jul 06 Python
Python用dilb提取照片上人脸的示例
Oct 26 Python
python 可视化库PyG2Plot的使用
Jan 21 Python
python如何实现递归转非递归
Feb 25 Python
教你用python实现12306余票查询
Jun 30 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
实时抓取YAHOO股票报价的代码
2006/10/09 PHP
理解和运用PHP中的多态性[译]
2011/08/02 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
PHP多进程简单实例小结
2019/11/09 PHP
jquery cookie插件代码类
2009/05/26 Javascript
Javascript 面向对象(三)接口代码
2012/05/23 Javascript
js动态添加onclick事件可传参数与不传参数
2014/07/29 Javascript
javascript实现简单的分页特效
2015/08/12 Javascript
浅谈JS原型对象和原型链
2016/03/02 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
js友好的时间返回函数
2016/08/24 Javascript
vue2.0 循环遍历加载不同图片的方法
2018/03/06 Javascript
vue 中基于html5 drag drap的拖放效果案例分析
2018/11/01 Javascript
layDate插件设置开始和结束时间
2018/11/15 Javascript
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
vue实现前端列表多条件筛选
2020/10/26 Javascript
Python中的filter()函数的用法
2015/04/27 Python
Python中表达式x += y和x = x+y 的区别详解
2017/06/20 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
padas 生成excel 增加sheet表的实例
2018/12/11 Python
python画柱状图--不同颜色并显示数值的方法
2018/12/13 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
2019/04/11 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
Python调用Redis的示例代码
2020/11/24 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
使用css如何制作时间ICON方法实践
2012/11/12 HTML / CSS
介绍一下linux的文件系统
2012/03/20 面试题
网络教育自我鉴定
2013/11/01 职场文书
初一生物教学反思
2014/01/18 职场文书
新闻学专业大学生职业生涯规划范文
2014/03/02 职场文书
优秀求职信
2014/05/29 职场文书
2014年挂职干部工作总结
2014/12/06 职场文书
教师先进事迹材料
2014/12/16 职场文书
世界水日宣传活动总结
2015/02/09 职场文书
因公司原因离职的辞职信范文
2015/05/12 职场文书
担保书范文
2019/07/09 职场文书