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 14 Python
python计算方程式根的方法
May 07 Python
Python检测QQ在线状态的方法
May 09 Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
Aug 30 Python
浅谈django的render函数的参数问题
Oct 16 Python
python开启debug模式的方法
Jun 27 Python
详解Python Qt的窗体开发的基本操作
Jul 14 Python
python数据预处理之数据标准化的几种处理方式
Jul 17 Python
python实现一个函数版的名片管理系统过程解析
Aug 27 Python
Django 实现xadmin后台菜单改为中文
Nov 15 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
Nov 24 Python
Python WebSocket长连接心跳与短连接的示例
Nov 24 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绘制在图片上的正余弦曲线
2013/06/08 PHP
ThinkPHP采用实现三级循环代码实例
2014/07/18 PHP
ThinkPHP整合百度Ueditor图文教程
2014/10/21 PHP
PHP实现清除wordpress里恶意代码
2015/10/21 PHP
PHP数组函数知识汇总
2016/05/12 PHP
jQueryPad 实用的jQuery测试工具(支持IE,chrome,FF)
2010/05/22 Javascript
javascript 循环读取JSON数据的代码
2010/07/17 Javascript
JavaScript实现简单的时钟实例代码
2013/11/23 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
eclipse导入jquery包后报错的解决方法
2014/02/17 Javascript
IE6兼容透明背景图片及解决方案
2015/08/19 Javascript
js实现带圆角的多级下拉菜单效果
2015/08/28 Javascript
JQuery学习总结【二】
2016/12/01 Javascript
jQuery实现背景滑动菜单
2016/12/02 Javascript
ES6 系列之 WeakMap的使用示例
2018/08/06 Javascript
学习使用ExpressJS 4.0中的新Router的用法
2018/11/06 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
vue-cli3 项目从搭建优化到docker部署的方法
2019/01/28 Javascript
vue+web端仿微信网页版聊天室功能
2019/04/30 Javascript
JavaScript构造函数原理及实现流程解析
2020/11/19 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
[02:10]2018DOTA2亚洲邀请赛赛前采访-Liquid
2018/04/03 DOTA
python将txt文档每行内容循环插入数据库的方法
2018/12/28 Python
python hash每次调用结果不同的原因
2019/11/21 Python
Python中常用的高阶函数实例详解
2020/02/21 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
2020/02/28 Python
浅谈CSS3鼠标移入图片动态提示效果(transform)
2017/11/06 HTML / CSS
打造经典复古风格的品牌:Alice + Olivia(爱丽丝+奥利维亚)
2016/09/07 全球购物
成功的餐厅经营创业计划书
2014/01/15 职场文书
汽车专业学生自我评价
2014/01/19 职场文书
企业党员公开承诺书
2014/03/26 职场文书
建筑节能汇报材料
2014/08/22 职场文书
关于环保的宣传稿
2015/07/23 职场文书
就业指导讲座心得体会
2016/01/15 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
导游词之四川熊猫基地
2020/01/13 职场文书