Python Fire试用体验

简介: 之前用Python写过一些CLI的小工具,在CLI命令行传参处理上,一般都是用argparse,最近看到Google开源的Python Fire(2017-3-2就开源了), 把argparse包装了,可以自动将代码转变成 CLI,开发者无需做任何额外工作。减少没有技术含量的代码量,减少低级Bug产生可能,节省了宝贵的吃鸡时间。这么有意义的库,那么肯定要推荐下给小伙伴们。 ## Python

之前用Python写过一些CLI的小工具,在CLI命令行传参处理上,一般都是用argparse,最近看到Google开源的Python Fire(2017-3-2就开源了), 把argparse包装了,可以自动将代码转变成 CLI,开发者无需做任何额外工作。减少没有技术含量的代码量,减少低级Bug产生可能,节省了宝贵的吃鸡时间。这么有意义的库,那么肯定要推荐下给小伙伴们。

Python Fire优点

  • 省心。开发者不必定义参数,设置帮助信息,或者编写定义代码运行方式的 main 函数。相反,开发者只需从 main 模块调用“Fire”函数,其余工作全部交由 Python Fire 来完成。
  • 有爱。Fire自带检查功能,将 Python 对象(无论是类、对象、字典、函数甚至整个模块)转变成一个 Tab 命令补全和文档齐备的命令行界面,并且这个 CLI 在代码发生变化时,也能即时更新。

上手体验

拿阿里云IoT物联网套件的Python SDK的demo script做下改造,使用Python Fire,使其支持CLI命令行传参:

# -*- coding: utf-8 -*-

from aliyunsdkcore import client
from aliyunsdkiot.request.v20170420 import RegistDeviceRequest
from aliyunsdkiot.request.v20170420 import PubRequest
import fire
import base64

def mqtt_client(access_key_id, access_key_secret, message_content, region_id, product_key, device_name):
    clt = client.AcsClient(access_key_id, access_key_secret, region_id)

    request = PubRequest.PubRequest()
    request.set_accept_format('json')  #设置返回数据格式,默认为XML
    request.set_ProductKey(product_key)
    request.set_TopicFullName('/' + product_key + '/' + device_name + '/get')  #消息发送到的Topic全名
    request.set_MessageContent(base64.encodestring(message_content)) 
    request.set_Qos(0)
    result = clt.do_action_with_exception(request)
    print 'result : ' + result


if __name__ == '__main__':
  fire.Fire(mqtt_client)

跑一个help 看下效果

python mqtt-client.py -- --help

Type:        function
String form: <function mqtt_client at 0x109d340c8>
File:        mqtt-client.py
Line:        9

Usage:       mqtt-client.py ACCESS_KEY_ID ACCESS_KEY_SECRET MESSAGE_CONTENT REGION_ID PRODUCT_KEY DEVICE_NAME
             mqtt-client.py --access-key-id ACCESS_KEY_ID --access-key-secret ACCESS_KEY_SECRET --message-content MESSAGE_CONTENT --region-id REGION_ID --product-key PRODUCT_KEY --device-name DEVICE_NAME

如上Usage所示,Python Fire同时支持两种方式的传参。

出错时的告示

python mqtt-client.py

Fire trace:
1. Initial component
2. ('The function received no value for the required argument:', 'region_id')

Type:        function
String form: <function mqtt_client at 0x1046280c8>
File:        mqtt-client.py
Line:        9

Usage:       mqtt-client.py ACCESS_KEY_ID ACCESS_KEY_SECRET MESSAGE_CONTENT REGION_ID PRODUCT_KEY DEVICE_NAME
             mqtt-client.py --access-key-id ACCESS_KEY_ID --access-key-secret 
ACCESS_KEY_SECRET --message-content MESSAGE_CONTENT 
--region-id REGION_ID --product-key PRODUCT_KEY --device-name DEVICE_NAME

交互模式

每个 Fire CLI 都自带交互模式。运行 CLI 时带“-- --interactive”标志可启动一个 IPython REPL,其中包含命令的结果以及其他已经定义并可随时使用的有用变量。

跑下看,效果很赞。

python mqtt-client.py -- --interactive

Fire is starting a Python REPL with the following objects:
Modules: PubRequest, RegistDeviceRequest, base64, client, fire
Objects: component, mqtt_client, result, trace

Python 2.7.10 (default, Feb  7 2017, 00:08:15)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

广告时间

Python Fire可通过“pip install fire”从 pypi 获得,其源代码在 GitHub 上公开:https://github.com/google/python-fire ,源代码内有详细的文档说明,以及各种案例代码,大家有兴趣可以了解下。

经@涂伟忠(伟忠) 提醒,Click也有人用,不过涂伟忠(伟忠) 对比体验后,觉得Python Fire最好用。
附上libhunt的Python Fire vs Click: https://python.libhunt.com/compare-python-fire-vs-click

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
存储 Shell Python
基于Python的一个开源命令行工具Python Fire
基于Python的一个开源命令行工具Python Fire
350 0
基于Python的一个开源命令行工具Python Fire
|
Python
python学习: fire库的使用教程
python学习: fire库的使用教程
304 0
python学习: fire库的使用教程
|
Python
Python编程:使用sys、argparse、click、fire实现命令行参数解析
Python编程:使用sys、argparse、click、fire实现命令行参数解析
193 0
|
Python
Python编程:fire库自动生成命令行接口
Python编程:fire库自动生成命令行接口
103 0
|
JSON 数据安全/隐私保护 数据格式
SpringBoot中的异常处理与参数校验_2
  兄弟们好,这次来跟老铁交流两个问题,异常和参数校验,在说参数校验之前我们先来说异常处理吧,因为后面参数的校验会牵扯到异常处理这块的内容。   说到异常处理,我不知道大家有没有写过或者遇到过如下的写法。
209 0
|
Python
Python编程:fire库自动生成命令行接口
Python编程:fire库自动生成命令行接口
112 0
|
开发工具 git Python
Google 开源的 Python 命令行库:fire 实现 git 命令
涉及的示例代码和历史文章,已同步更新到 HelloGitHub-Team 仓库 一、前言 在前面三篇介绍 fire 的文章中,我们全面了解了 fire 强大而不失简洁的能力。按照惯例,我们要像使用 argparse、docopt 和 click 一样使用 fire 来实现 git 命令。 本文的关注点并不在 git 的各种命令是如何实现的,而是怎么使用 fire 去打造一个实用命令行程序,代码结构是怎样的。因此,和 git 相关的操作,将会使用 gitpython 库来简单实现。 为了让没读过 使用 xxx 实现 git 命令(xxx 指 argparse、docopt 和 click)
145 0