Python Fire试用体验

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

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

上一篇:P2P金融行业的云上数据安全,核心数据安全如何保障


下一篇:SQL,PL/SQL 数据类型一览表