作者:刘志军,6年+Python使用经验, 高级开发工程师,目前在互联网医疗行业从事Web系统构架工作
个人公众号:Python之禅(微信ID:vttalk)
题图:Photo by Mark Rabe on Unsplash
在 Python 中,命令行解析库有非常多的选择方案,系统自带的 模块有 argparse,有 Flask 作者写的 click,但是 argparse 使用起来啰嗦, 要经历解析器初始化、参数定义、解析一套流程。例如:
# -*- coding: utf-8 -*- # arg_test.py import argparsedef counter (file_type=None) : return {file_type: 100 }# 初始化解析器 parser = argparse.ArgumentParser()# 定义参数 parser.add_argument("-f" , "--file" , help="统计指定文件类型" )# 解析 args = parser.parse_args() print(counter(args.file))
运行:
$ python arg_test.py -f python {'python' : 100 }
而 click 则是以装饰器的形式作用在目标函数中,要侵入函数本身,本质上还是对 argparse 的一种改进,并没有太多创新,算是一种改良作品
# -*- coding: utf-8 -*- import argparseimport click@click.command() @click.option("-f", "--file", help="统计制定文件类型") def counter (file=None) : click.echo({file: 100 })if __name__ == '__main__' : print(counter())
运行:
$ python firetest.py -f python {u'python' : 100 }
接下来要介绍的这个命令行解析工具非常牛逼,把命令行工具做到了极致,算是一种颠覆式创新,一行代码能把函数导出到命令行窗口,这个工具叫Python-fire,可能经常写命令行工具的人知道,该项目是 Google 开源的 Python 库(可能是 Google 工程师的 Side Project,因为项目主页申明说它不是 Google 官方项目),名字就像一团🔥。
安装 pip install fire
用法1: fire.Fire() 直接在程序中调用 fire.Fire(),不需要修改目标函数,fire 会把当前模块下的所有对象导出到命令行中
# firetest.py import firedef foo (name) : return 'foo {name}!' .format(name=name)def bar (name) : return "bar {name}" .format(name=name)if __name__ == '__main__' : fire.Fire()
运行:
# 调用方式:python [文件名] [函数名] [参数] # 函数名后面直接跟参数值 $ python firetest.py foo hello foo hello!# 也可以显示地先指定参数名,再跟参数值 $ python firetest.py bar --name hello bar hello!
用法2: fire.Fire() Fire 可以指定某个函数导出到命令行
import firedef foo (name) : return 'foo {name}!' .format(name=name)if __name__ == '__main__' : fire.Fire(foo)
运行:
# 调用方式:python [函数名] [参数] $ python firetest.py hello foo hello!
当 Fire 接收函数 foo 作为参数时,只加载 foo 函数到命令行中,此时,在命令行中运行时也无需再指定函数名字,只需要指定参数就好。
用法3:fire.Fire() Fire 不仅可以接收函数,还可以接收字典对象作为参数,可在字典中配置那些函数需要导出到命令行中。例如,有加减乘3个函数,我们可以选择性的选择其中2个导出到命令行:
import firedef add (x, y) : return x + ydef multiply (x, y) : return x * ydef subtract (x, y) : return x - yif __name__ == '__main__' : fire.Fire({ 'add' : add, 'subtract' : subtract, })
运行:
$ python firetest.py add 1 4 5 $ python firetest.py subtract 1 4 -3 $ python firetest.py multiply 1 4 # multiply 会报错,因为没有导出
用法4:fire.Fire() Fire 还可以接收类的实例对象
import fireclass Calculator(object) : def add (self, x, y) : return x + y def multiply (self, x, y) : return x * yif __name__ == '__main__' : calculator = Calculator() fire.Fire(calculator)
使用方式还是和前面的一样
$ python firetest.py add 10 20 30 $ python firetest.py multiply 10 20 200
更多用法可以参考python-fire的文档:https://github.com/google/python-fire/blob/master/docs/guide.md
Python爱好者社区历史文章大合集 :
Python爱好者社区历史文章列表(每周append更新一次)
福利:文末扫码立刻关注公众号,“Python爱好者社区” ,开始学习Python课程:
关注后在公众号内回复 “课程 ” 即可获取:
0.小编的Python入门视频课程!!!
1.崔老师爬虫实战案例 免费学习视频。
2.丘老师 数据科学入门指导 免费学习视频。
3.陈老师 数据分析报告制作 免费学习视频。
4. 玩转大数据分析!Spark2.X+Python 精华实战课程 免费学习视频。
5.丘老师 Python网络爬虫实战 免费学习视频。