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 相关文章推荐
Cpy和Python的效率对比
Mar 20 Python
python用10行代码实现对黄色图片的检测功能
Aug 10 Python
TensorFLow用Saver保存和恢复变量
Mar 10 Python
Python hashlib模块用法实例分析
Jun 12 Python
Python双向循环链表实现方法分析
Jul 30 Python
python print输出延时,让其立刻输出的方法
Jan 07 Python
python实现tail -f 功能
Jan 17 Python
Python切割图片成九宫格的示例代码
Mar 10 Python
Python使用文件操作实现一个XX信息管理系统的示例
Jul 02 Python
Python批量获取并保存手机号归属地和运营商的示例
Oct 09 Python
浅谈Python 中的复数问题
May 19 Python
python中 Flask Web 表单的使用方法
May 20 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
Mysql的常用命令
2006/10/09 PHP
《PHP边学边教》(04.编写简易的通讯录――视频教程1)
2006/12/13 PHP
php中的动态调用实例分析
2015/01/07 PHP
Laravel 5框架学习之Laravel入门和新建项目
2015/04/07 PHP
Yii2中datetime类的使用
2016/12/17 PHP
php判断文件上传图片格式的实例详解
2017/09/30 PHP
浅析php如何实现爬取数据原理
2018/09/27 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
JavaScript 新手24条实用建议[TUTS+]
2009/06/21 Javascript
浅析document.ready和window.onload的区别讲解
2013/12/18 Javascript
javascript中直接引用Microsoft的COM生成Word
2014/01/20 Javascript
jQuery 选择器详解
2015/01/19 Javascript
微信小程序商城项目之淘宝分类入口(2)
2017/04/17 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
Vue CLI3搭建的项目中路径相关问题的解决
2018/09/17 Javascript
Layui数据表格 前后端json数据接收的方法
2019/09/19 Javascript
JS document文档的简单操作完整示例
2020/01/13 Javascript
[02:04]完美世界城市挑战赛秋季赛报名开始 谁是solo路人王?
2019/10/10 DOTA
浅谈机器学习需要的了解的十大算法
2017/12/15 Python
python 读取Linux服务器上的文件方法
2018/12/27 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
Django框架搭建的简易图书信息网站案例
2019/05/25 Python
使用python实现简单五子棋游戏
2019/06/18 Python
Django密码系统实现过程详解
2019/07/19 Python
python 基于Apscheduler实现定时任务
2020/12/15 Python
Python脚本调试工具安装过程
2021/01/11 Python
HTML文本属性&颜色控制属性的实现
2019/12/17 HTML / CSS
MIKI HOUSE美国官方网上商店:日本领先的婴儿和儿童高级时装品牌
2020/06/21 全球购物
英国马莎百货印度官网:Marks & Spencer印度
2020/10/08 全球购物
交通安全责任书范本
2014/07/24 职场文书
春游踏青活动方案
2014/08/14 职场文书
授权委托书样本
2014/09/25 职场文书
常用的MongoDB查询语句的示例代码
2021/07/25 MongoDB
python数字类型和占位符详情
2022/03/13 Python
Java 数据结构七大排序使用分析
2022/04/02 Java/Android