之前用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