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下函数参数的传递(参数带星号的说明)
Sep 19 Python
Python使用SocketServer模块编写基本服务器程序的教程
Jul 12 Python
python Pandas 读取txt表格的实例
Apr 29 Python
解决tensorflow测试模型时NotFoundError错误的问题
Jul 27 Python
Python 实现Windows开机运行某软件的方法
Oct 14 Python
使用50行Python代码从零开始实现一个AI平衡小游戏
Nov 21 Python
Django数据库类库MySQLdb使用详解
Apr 28 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
Nov 15 Python
python将邻接矩阵输出成图的实现
Nov 21 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
Dec 19 Python
Pytorch根据layers的name冻结训练方式
Jan 06 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
Apr 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
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
2006/11/18 PHP
解析php中如何调用用户自定义函数
2013/08/06 PHP
php中删除、清空session的方式总结
2015/10/09 PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
2015/12/21 PHP
浅谈Laravel核心解读之Console内核
2018/12/02 PHP
详解Laravel服务容器的绑定与解析
2019/11/05 PHP
thinkphp5.1框架模板赋值与变量输出示例
2020/05/25 PHP
JavaScript入门教程(8) Location地址对象
2009/01/31 Javascript
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
淘宝搜索框效果实现分析
2011/03/05 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
2012/12/28 Javascript
JS延迟加载加快页面打开速度示例代码
2013/12/30 Javascript
nodejs文件操作模块FS(File System)常用函数简明总结
2014/06/05 NodeJs
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
2016/10/16 Javascript
js实现字符全排列算法的简单方法
2017/05/01 Javascript
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
weui框架实现上传、预览和删除图片功能代码
2017/08/24 Javascript
引入JavaScript时alert弹出框显示中文乱码问题
2017/09/16 Javascript
JS多个异步请求 按顺序执行next实现解析
2019/09/16 Javascript
javascript实现简易的计算器
2020/01/17 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
three.js显示中文字体与tween应用详析
2021/01/04 Javascript
[36:41]完美世界DOTA2联赛循环赛FTD vs Magma第一场 10月30日
2020/10/31 DOTA
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
Django 实现购物车功能的示例代码
2018/10/08 Python
详解python 3.6 安装json 模块(simplejson)
2019/04/02 Python
Python 实现简单的客户端认证
2020/07/29 Python
个性化皮包、小袋、生活配件:Mon Purse
2019/03/26 全球购物
师范应届生教师求职信
2013/11/05 职场文书
个人函授自我鉴定
2014/03/25 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书
群众路线教师自我剖析材料
2014/09/29 职场文书
《金色的草地》教学反思
2016/02/17 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP