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实现Linux下守护进程的编写方法
Aug 22 Python
Python深入学习之装饰器
Aug 31 Python
Python中的rjust()方法使用详解
May 19 Python
Python的requests网络编程包使用教程
Jul 11 Python
python将ansible配置转为json格式实例代码
May 15 Python
新手如何快速入门Python(菜鸟必看篇)
Jun 10 Python
Python设计模式之迭代器模式原理与用法实例分析
Jan 10 Python
Django Rest framework权限的详细用法
Jul 25 Python
Python爬虫爬取Bilibili弹幕过程解析
Oct 10 Python
Python如何操作office实现自动化及win32com.client的运用
Apr 01 Python
python 19个值得学习的编程技巧
Aug 15 Python
python实现MD5进行文件去重的示例代码
Jul 09 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 include和require的区别深入解析
2013/06/17 PHP
php中file_get_content 和curl以及fopen 效率分析
2014/09/19 PHP
php上传文件问题汇总
2015/01/30 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
PHP针对redis常用操作实例详解
2019/08/17 PHP
javascript中"/"运算符常见错误
2010/10/13 Javascript
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
JS模拟自动点击的简单实例
2013/08/08 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
javascript使用prototype完成单继承
2014/12/24 Javascript
分享一个精简的vue.js 图片lazyload插件实例
2017/03/13 Javascript
关于定制FileField中的上传文件名称问题
2017/08/22 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
在Vue中使用axios请求拦截的实现方法
2018/10/25 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
2020/07/27 Javascript
Vue实现穿梭框效果
2020/09/30 Javascript
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
Linux 下 Python 实现按任意键退出的实现方法
2016/09/25 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
2017/08/18 Python
分析python动态规划的递归、非递归实现
2018/03/04 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
Django nginx配置实现过程详解
2020/09/10 Python
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
工商管理专业实习大学生自我鉴定
2013/09/19 职场文书
应届生妇产科护士求职信
2013/10/27 职场文书
大学毕业自我评价
2014/02/02 职场文书
暑期社会实践先进个人主要事迹
2014/05/22 职场文书
健康证明
2015/06/19 职场文书
使用Python通过企业微信应用给企业成员发消息
2022/04/18 Python