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 相关文章推荐
使用cx_freeze把python打包exe示例
Jan 24 Python
手动实现把python项目发布为exe可执行程序过程分享
Oct 23 Python
Python中类的继承代码实例
Oct 28 Python
Python进行数据科学工作的简单入门教程
Apr 01 Python
深入理解Python单元测试unittest的使用示例
Nov 18 Python
如何使用Python进行OCR识别图片中的文字
Apr 01 Python
Pytorch数据拼接与拆分操作实现图解
Apr 30 Python
python GUI模拟实现计算器
Jun 22 Python
Python中logging日志的四个等级和使用
Nov 17 Python
python抢购软件/插件/脚本附完整源码
Mar 04 Python
图文详解matlab原始处理图像几何变换
Jul 09 Python
使用Python解决图表与画布的间距问题
Apr 11 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
Body是什么,该怎么喝出咖啡里的口感
2021/03/03 咖啡文化
CI框架实现创建自定义类库的方法
2018/12/25 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
javascript 中__proto__和prototype详解
2014/11/25 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
jquery实现简单文字提示效果
2015/12/02 Javascript
jQuery点击按钮弹出遮罩层且内容居中特效
2015/12/14 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
最实用的jQuery分页插件
2016/10/09 Javascript
微信小程序 生命周期和页面的生命周期详细介绍
2017/01/19 Javascript
基于 webpack2 实现的多入口项目脚手架详解
2017/06/26 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
js实现导航跟随效果
2018/11/17 Javascript
vue组件之间通信实例总结(点赞功能)
2018/12/05 Javascript
详解微信小程序开发(项目从零开始)
2019/06/06 Javascript
使用VScode 插件debugger for chrome 调试react源码的方法
2019/09/13 Javascript
详解Python如何生成词云的方法
2018/06/01 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
Python中垃圾回收和del语句详解
2018/11/15 Python
python实现狄克斯特拉算法
2019/01/17 Python
PYQT5设置textEdit自动滚屏的方法
2019/06/14 Python
python 同时读取多个文件的例子
2019/07/16 Python
Django 解决新建表删除后无法重新创建等问题
2020/05/21 Python
selenium+python实现基本自动化测试的示例代码
2021/01/27 Python
html5应用缓存_动力节点Java学院整理
2017/07/13 HTML / CSS
香港网上花店:FlowerAdvisor香港
2019/05/30 全球购物
英国Lookfantastic中文网站:护肤品美妆美发购物(英国直邮)
2020/04/27 全球购物
社区工作者思想汇报
2014/01/13 职场文书
《藏戏》教学反思
2014/02/11 职场文书
遥感技术与仪器求职信
2014/02/22 职场文书
团队拓展活动方案
2014/08/28 职场文书
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python
Python jiaba库的使用详解
2021/11/23 Python
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android