专栏名称: Python爱好者社区
人生苦短,我用Python。分享Python相关的技术文章、工具资源、精选课程、视频教程、热点资讯、学习资料等。每天自动更新和推送。
目录
相关文章推荐
Python爱好者社区  ·  史上最强!LSTM杀疯了 ·  昨天  
Python爱好者社区  ·  甘露寺2024年招聘公告!环境清幽,包吃包住 ... ·  1 周前  
Python爱好者社区  ·  终于知道工资为什么要保密了... ·  6 天前  
Python爱好者社区  ·  100个即插即用缝合模块.PDF ·  1 周前  
Python爱好者社区  ·  yyds!100个即插即用缝合模块(附下载) ·  1 周前  
51好读  ›  专栏  ›  Python爱好者社区

一个“牛逼”的 Python 命令行解析库

Python爱好者社区  · 公众号  · Python  · 2017-12-02 17:30

正文

作者:刘志军,6年+Python使用经验, 高级开发工程师,目前在互联网医疗行业从事Web系统构架工作

个人公众号:Python之禅(微信ID:vttalk)


题图:Photo by Mark Rabe on Unsplash

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

# -*- coding: utf-8 -*-
# arg_test.py

import argparse

def 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 argparse
import 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 fire

def 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 fire

def 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 fire

def add(x, y):
   return x + y

def multiply(x, y):
   return x * y

def subtract(x, y):
   return x - y

if __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 fire

class Calculator(object):

 def add(self, x, y):
   return x + y

 def multiply(self, x, y):
   return x * y

if __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网络爬虫实战免费学习视频。

推荐文章
Python爱好者社区  ·  史上最强!LSTM杀疯了
昨天
Python爱好者社区  ·  终于知道工资为什么要保密了...
6 天前
Python爱好者社区  ·  100个即插即用缝合模块.PDF
1 周前
Python爱好者社区  ·  yyds!100个即插即用缝合模块(附下载)
1 周前
呦呦鹿鸣  ·  说人话、说真话、说话算话
8 年前
韶大lens视觉杂志  ·  去流浪吧,我知道你终将回来
7 年前
乐趣微生活  ·  娶到这样的老婆,谁还找别人!【NO8】
7 年前
玩物志  ·  借你一分钟,决定玩物志的未来
7 年前