分享

一个超神的 Python 命令行解析库

 庆亮trj21bcn0z 2017-11-21


在 Python 中,命令行解析库有非常多的选择方案,系统自带的 模块有 argparse,有 Flask 作者写的 click,但是 argparse 使用起来啰嗦, 要经历解析器初始化、参数定义、解析一套流程。例如:

# -*- coding: utf-8 -*-# arg_test.pyimport 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.pyimport 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 hellofoo hello!# 也可以显示地先指定参数名,再跟参数值$ python firetest.py bar --name hellobar 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 hellofoo 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 45$ 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 2030$ python firetest.py multiply 10 20200

更多用法可以参考python-fire的文档:https://github.com/google/python-fire/blob/master/docs/guide.md

End.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多