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 IDLE加上自动补全和历史功能
Nov 30 Python
Python文件的读写和异常代码示例
Oct 31 Python
Python虚拟环境项目实例
Nov 20 Python
Python获取网段内ping通IP的方法
Jan 31 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
Oct 25 Python
python 使用shutil复制图片的例子
Dec 13 Python
python统计字符的个数代码实例
Feb 07 Python
基于Tensorflow:CPU性能分析
Feb 10 Python
在keras中对单一输入图像进行预测并返回预测结果操作
Jul 09 Python
Python接口自动化测试的实现
Aug 28 Python
python实现按日期归档文件
Jan 30 Python
python unittest单元测试的步骤分析
Aug 02 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 UTF8 文件的签名问题
2009/10/30 PHP
fgetcvs在linux的问题
2012/01/15 PHP
php生成rss类用法实例
2015/04/14 PHP
php版微信公众号自定义分享内容实现方法
2016/09/22 PHP
自制PHP框架之路由与控制器
2017/05/07 PHP
javascript开发中因空格引发的错误
2010/11/08 Javascript
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
JQuery for与each性能比较分析
2013/05/14 Javascript
jQuery表格排序组件-tablesorter使用示例
2014/05/26 Javascript
JQuery跳出each循环的方法
2015/04/16 Javascript
JS特效实现图片自动播放并可控的效果
2015/07/31 Javascript
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
BootStrap tooltip提示框使用小结
2016/10/26 Javascript
使用jQuery的load方法设计动态加载及解决被加载页面js失效问题
2017/03/01 Javascript
详解用node编写自己的cli工具
2017/05/23 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
微信小程序实现比较功能的方法汇总(五种方法)
2020/03/07 Javascript
[02:51]2014DOTA2 TI小组赛总结中国军团全部进军钥匙球馆
2014/07/15 DOTA
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS TNC
2018/03/30 DOTA
python 通过 socket 发送文件的实例代码
2018/08/14 Python
Python+PyQT5的子线程更新UI界面的实例
2019/06/14 Python
解决pytorch-yolov3 train 报错的问题
2020/02/18 Python
详解Pycharm安装及Django安装配置指南
2020/09/15 Python
python 多线程中join()的作用
2020/10/29 Python
js实现移动端H5页面手指滑动刻度尺功能
2017/11/16 HTML / CSS
L’AGENCE官网:加州女装品牌
2018/06/03 全球购物
美国知名的旅游网站:OneTravel
2018/10/09 全球购物
Clarks西班牙官方在线商店:clarks鞋
2019/05/03 全球购物
中医专业职业生涯规划书范文
2014/01/04 职场文书
运动会邀请函范文
2014/01/31 职场文书
售后服务承诺书模板
2014/05/21 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
缓刑期间思想汇报范文
2014/10/10 职场文书
统计工作个人总结
2015/03/03 职场文书
起诉书格式范文
2015/05/20 职场文书
MySQL优化及索引解析
2022/03/17 MySQL