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实现抓取网页并且解析的实例
Sep 20 Python
Python中的装饰器用法详解
Jan 14 Python
单链表反转python实现代码示例
Feb 08 Python
Python实现绘制双柱状图并显示数值功能示例
Jun 23 Python
使用python获取(宜宾市地震信息)地震信息
Jun 20 Python
python读写csv文件实例代码
Jul 05 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
Aug 27 Python
python智联招聘爬虫并导入到excel代码实例
Sep 09 Python
python实现从尾到头打印单链表操作示例
Feb 22 Python
Python中关于logging模块的学习笔记
Jun 03 Python
Python常用数据分析模块原理解析
Jul 20 Python
python单向链表实例详解
May 25 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 多关键字 高亮显示实现代码
2012/04/23 PHP
php异步多线程swoole用法实例
2014/11/14 PHP
PHP简单获取视频预览图的方法
2015/03/12 PHP
php中引用&的用法分析【变量引用,函数引用,对象引用】
2016/12/12 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
2017/03/12 PHP
PHP使用Redis实现防止大并发下二次写入的方法
2017/10/09 PHP
nodejs文件操作模块FS(File System)常用函数简明总结
2014/06/05 NodeJs
jQuery模拟新浪微博首页滚动效果的方法
2015/03/11 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
2015/08/21 Javascript
Node.js实现数据推送
2016/04/14 Javascript
三种方式实现瀑布流布局
2017/02/10 Javascript
微信小程序实战之自定义抽屉菜单(7)
2017/04/18 Javascript
python实现查找两个字符串中相同字符并输出的方法
2015/07/11 Python
简单谈谈Python中的反转字符串问题
2016/10/24 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
2017/07/13 Python
python3.6数独问题的解决
2019/01/21 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
django中上传图片分页三级联动效果的实现代码
2019/08/30 Python
python3 pathlib库Path类方法总结
2019/12/26 Python
Python下划线5种含义代码实例解析
2020/07/10 Python
Python importlib模块重载使用方法详解
2020/10/13 Python
css3 transform及原生js实现鼠标拖动3D立方体旋转
2016/06/20 HTML / CSS
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
耐克美国官网:Nike.com
2016/08/01 全球购物
加拿大鞋子连锁店:Town Shoes
2016/09/26 全球购物
Farfetch美国:奢侈品牌时尚购物平台
2019/05/02 全球购物
大学毕业生自我鉴定
2013/11/05 职场文书
电信专业毕业生推荐信
2013/11/18 职场文书
民生工程实施方案
2014/03/22 职场文书
小学竞选班长演讲稿
2014/09/09 职场文书
婚前协议书范本两则
2014/10/16 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
2015毕业生实习期工作总结
2015/04/09 职场文书
2015年文明创建工作总结
2015/04/30 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
vue响应式原理与双向数据的深入解析
2021/06/04 Vue.js