Google 开源的 Python 命令行库:初探 fire

作者:HelloGitHub-Prodesire

HelloGitHub 的《讲解开源项目》系列,项目地址:https://github.com/HelloGitHub-Team/Article

一、前言

在本系列前面所有文章中,我们分别介绍了 argparsedocoptclick 的主要功能和用法。它们各具特色,都能出色地完成命令行任务。argparse 是面向过程的,需要先设置解析器,再定义参数,再解析命令行,最后实现业务逻辑。docopt 先用声明式的语法定义出参数,再过程式地解析命令行和实现业务逻辑。click 则是用装饰器的方式进一步简化显式的命令调用逻辑,但仍然不够面向对象。

而今天要介绍的 fire 则是用一种面向广义对象的方式来玩转命令行,这种对象可以是类、函数、字典、列表等,它更加灵活,也更加简单。

本系列文章默认使用 Python 3 作为解释器进行讲解。
若你仍在使用 Python 2,请注意两者之间语法和库的使用差异哦~

二、介绍

fire 可以根据任何 Python 对象自动生成命令行接口。它有如下特性:

  • 能以简单的方式生成 CLI
  • 是一个开发和调试 Python 代码的实用工具
  • 能将现存代码或别人的代码转换为 CLI
  • 使得在 Bash 和 Python 间的转换变得更容易
  • 通过预先为 REPL 设置所需的模块和变量,使得实用 REPL 更加容易

通过如下命令可快速安装 fire 库:

pip install fire

三、快速开始

回忆下使用 argparsedocoptclick 实现命令行程序的步骤:

  • 对于 argparse 来说,要先设置解析器,再定义参数,再解析命令行,最后实现业务逻辑(四步)
  • 对于 docopt 来说,要先定义定义接口描述,再解析命令行,最后实现业务逻辑(三步)
  • 对于 click 来说,就是实现业务逻辑和通过装饰器的方式定义参数(两步)

它们的实现步骤越来越简单,从四步简化到了两步。而今天的主角 fire 只需一步,现业务逻辑就够了。

这简直简单的不可思议,为什么这样做就够了?我们不妨考虑下 Python 中的函数,函数是不是可以对应一个命令行程序,而函数的参数可以对应命令行程序的参数和选项呢?再看看 Python 中的类,一个类是不是可以对应一个命令行程序,而类中的每个实例方法就可以对应子命令,实例方法中的参数就是对应子命令的参数和选项。

这么一想,理论上确实是可以实现的,我们不妨通过下面的示例来看看 fire 是如何让我们通过简单的方式实现命令行程序。

3.1 使用函数

来看这么一个例子:

import fire

def hello(name="World"):
  return 'Hello {name}!'.format(name=name)

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

在上述例子中定义一个 hello 函数,它接受 name 参数,并且有默认值 "World"。使用 fire.Fire(hello) 即可非常简单快速地实现命令功能,这个命令行就接受 --name 选项,不提供时使用默认值 "World",提供时就按提供的值来。

可在命令行中执行下列命令:

$ python hello.py
Hello World!
$ python hello.py --name=Prodesire
Hello Prodesire!
$ python hello.py --help
INFO: Showing help with the command 'hello.py -- --help'.

NAME
    hello.py

SYNOPSIS
    hello.py <flags>

FLAGS
    --name=NAME

3.2 使用类

使用函数是最简单的方式,如果我们想以更有组织的方式来实现,比如使用类,fire 也是支持的。

import fire

class Calculator(object):
  """A simple calculator class."""

  def double(self, number):
    return 2 * number

  def triple(self, number):
    return 3 * number

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

在上述例子中定义一个 Calculator 类,它有两个实例方法 doubletriple,并且都接受 number 参数,没有默认值。使用 fire.Fire(Calculator) 即可非常简单快速地实现命令功能,这个命令行支持两个子命令 doubletriple,位置参数 NUMBER 或选项参数 --number

可在命令行中执行下列命令:

$ python calculator.py double 10
20
$ python calculator.py triple --number=15
45
$ python calculator.py double --help
INFO: Showing help with the command 'calculator.py double -- --help'.

NAME
    calculator.py double

SYNOPSIS
    calculator.py double NUMBER

POSITIONAL ARGUMENTS
    NUMBER

NOTES
    You can also use flags syntax for POSITIONAL ARGUMENTS

四、小结

fire 的使用方式非常简单,定一个 Python 对象,剩下的就交给 fire 来处理,可谓是非常的 Pythonic,这也是它会如此受欢迎的原因。

除了上面展示的内容,fire 还支持更多种类的 Python 对象,也拥有很多强大的功能,我们将在接下来几节中逐步走近它。



『讲解开源项目系列』——让对开源项目感兴趣的人不再畏惧、让开源项目的发起者不再孤单。跟着我们的文章,你会发现编程的乐趣、使用和发现参与开源项目如此简单。欢迎留言联系我们、加入我们,让更多人爱上开源、贡献开源~

原文地址:https://www.cnblogs.com/xueweihan/p/12084550.html

时间: 2024-11-02 09:29:00

Google 开源的 Python 命令行库:初探 fire的相关文章

Python进阶:都说好用的 Python 命令行库click

click 是一个以尽可能少的代码.以组合的方式创建优美的命令行程序的 Python 包.它有很高的可配置性,同时也能开箱即用. 它旨在让编写命令行工具的过程既快速又有趣,还能防止由于无法实现预期的 CLI API 所产生挫败感.它有如下三个特点: 任意嵌套命令 自动生成帮助 支持运行时延迟加载子命令 1.业务逻辑 首先定义业务逻辑,是不是感觉到有些难以置信呢? 不论是 argparse 还是 docopt,业务逻辑都是被放在最后一步,但 click 却是放在第一步.细想想 click 的这种方

用什么库写 Python 命令行程序?看这一篇就够了

作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Article 一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse.docopt.click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. 本文作为本次旅程的终点,希望从一个更高的视角对这些库进行横向对比,总结它们的异同点和使用场景,以期在应对不同

让你如绅士般基于描述编写 Python 命令行工具的开源项目:docopt

作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Article 一.前言 在本系列前面四篇文章中,我们介绍了 argparse 的方方面面.它无疑是强大的,但使用方式上略显麻烦.需要先设置解析器,再定义参数,再解析命令行,最后实现业务逻辑. 而今天要介绍的 docopt 则是站在一个全新的视角来审视命令行.你可曾想过,一个命令行程序的帮助信息其实已然包含了这个命令

Python 命令行之旅:使用 docopt 实现 git 命令

作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Article 一.前言 在前面两篇介绍 docopt 的文章中,我们全面了解了 docopt 的能力.按照惯例,我们要像使用 argparse 一样使用 docopt 来实现 git 命令. 为了让没读过 使用 argparse 实现 git 命令 的小伙伴也能读明白本文,我们仍会对 git 常用命令和 gitpy

Python命令行神器Click

Python命令行神器Click 官网: Click 是用Python写的一个第三方模块,用于快速创建命令行.我们知道,Python内置了一个Argparse 的标准库用于创建命令行,但使用起来有些繁琐,Click相比于Argparse,就好比requests 相比于urllib. 快速使用 Click 的使用大致有两个步骤: 使用 @click.command()装饰一个函数,使之成为命令行接口: 使用 @click.option()等装饰函数,为其添加命令行选项等. 它的一种典型使用形式如下

python学习笔记(8)-实现linux系统python命令行光标移动

本节点标题1.实现python命令行光标移动1.1.首先查看有没有安装readline-devel1.2.其次查看readline-devel正确的包名并安装1.3.最终编译安装python =======================================================================================================================1.实现python命令行光标移动在linux系统里,python移动

Python命令行参数

Python命令行参数: -d 在解析时显示调试信息 -O 生成优化代码 ( .pyo 文件 ) -S 启动时不引入查找Python路径的位置 -v 输出Python版本号 -X 从 1.6版本之后基于内建的异常(仅仅用于字符串)已过时. -c cmd 执行 Python 脚本,并将运行结果作为 cmd 字符串. file 在给定的python文件执行python脚本.

[Python]命令行进度条

关键点是输出'\r'这个字符可以使光标回到一行的开头,这时输出其它内容就会将原内容覆盖. import time import sys def progress_test(): bar_length=20 for percent in xrange(0, 100): hashes = '#' * int(percent/100.0 * bar_length) spaces = ' ' * (bar_length - len(hashes)) sys.stdout.write("\rPercent

python命令行补全

python命令行补全 大家都知道,在命令行界面输入命令时,是可通过tab键来补齐命令,这中设置十分方便,不用浪费较长时间在输入命令上.最近开始接触python,发现在python命令行下,使用tab键是无法补全命令的.我们可以设置成补全命令行的模式吗?答案是可以的. 我们可以在python命令行下导入模块 import readline, rlcompleter; readline.parse_and_bind("tab: complete") 这样设置,我们就可以使用tab键来补全