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之用while来循环
Oct 02 Python
python使用三角迭代计算圆周率PI的方法
Mar 20 Python
Python基于OpenCV实现视频的人脸检测
Jan 23 Python
Python Requests模拟登录实现图书馆座位自动预约
Apr 27 Python
django 删除数据库表后重新同步的方法
May 27 Python
NumPy 数学函数及代数运算的实现代码
Jul 18 Python
Python爬取成语接龙类网站
Oct 19 Python
python 画三维图像 曲面图和散点图的示例
Dec 29 Python
Python Selenium 之关闭窗口close与quit的方法
Feb 13 Python
在linux下实现 python 监控usb设备信号
Jul 03 Python
Python计算机视觉里的IOU计算实例
Jan 17 Python
Python序列化模块JSON与Pickle
Jun 05 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模拟post行为代码总结(POST方式不是绝对安全)
2012/02/22 PHP
PHP删除指定目录中的所有目录及文件的方法
2015/02/26 PHP
php字符串分割函数用法实例
2015/03/17 PHP
php结合web uploader插件实现分片上传文件
2016/05/10 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
2019/02/15 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
2021/03/09 PHP
jquery.blockUI.js上传滚动等待效果实现思路及代码
2013/03/18 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
JS获取元素多层嵌套思路详解
2016/05/16 Javascript
JavaScript中误用/g导致的正则test()无法正确重复执行的解决方案
2016/07/27 Javascript
JS 实现 ajax 异步浏览器兼容问题
2017/01/21 Javascript
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
vue-router源码之history类的浅析
2019/05/21 Javascript
JS实现数组删除指定元素功能示例
2019/06/05 Javascript
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
vue element和nuxt的使用技巧分享
2021/01/14 Vue.js
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
微信小程序实现点赞业务
2021/02/10 Javascript
[02:23]2016国际邀请赛中国区预选赛wings晋级之路
2016/06/29 DOTA
Python(TensorFlow框架)实现手写数字识别系统的方法
2018/05/29 Python
python使用time、datetime返回工作日列表实例代码
2019/05/09 Python
python导入不同目录下的自定义模块过程解析
2019/11/18 Python
W3C公布最新的HTML5标准草案
2008/10/17 HTML / CSS
台湾前三大B2C购物网站:MOMO购物网
2017/04/27 全球购物
vue项目实现分页效果
2021/03/24 Vue.js
司机岗位职责
2013/11/15 职场文书
加拿大探亲邀请信
2014/01/28 职场文书
家庭困难证明
2014/10/12 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书
2016年质量月活动总结报告
2016/04/05 职场文书
PHP获取学生成绩的方法
2021/11/17 PHP
UNION CREATIVE《Re:从零开始的异世界生活》雷姆手办
2022/03/20 日漫