Python Fire:自动生成命令行接口

Python Fire:零配置自动生成命令行接口的利器 命令行接口(CLI)是Python工程中连接代码与用户的关键桥梁,其核心原理在于将函数签名映射为可解析的参数结构,并通过类型推断与运行时反射实现自动化绑定。Python Fire凭借深度反射、智能类型推断和约定优于配置三大机制,显著降低CLI开发门槛,提升调试效率与跨团队协作体验。它不替代argparse或click,而是聚焦于‘已有Python函数即时暴露为CLI’这一高价值场景,广泛应用于数据科学pipeline、内部工具开发、CI/CD脚本及Jupyter快速验证等实践领域。本文深入解析Fire如何让 阅读详情

命令行程序是平时写一些小工具时最常用的方式。

为了让命令行程序更加灵活,我们常常会设置一些参数,根据参数让程序执行不同的功能。
这样就不用频繁的修改代码来执行不同的功能。

随着命令行程序功能的丰富,也就是参数多了以后,解析和管理参数之间的关系会变得越来越繁重。
而本次介绍的 Fire 库,正好可以解决这个问题。
使用 Fire 库,我们只要关心具体功能的实现,最后Fire会帮助我们自动把所有功能组织成一个命令行程序。

Fire库在github上的地址:github.com/google/pyth…

1. 一般命令

一般的命令,也就是带有几个参数的一段程序,比如:

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

def import_file(fp):
    print("import file from: {}".format(fp))

def export_file(fp):
    print("EXPORT file to: {}".format(fp))

这是模拟文件导出功能的两个函数。

使用 Fire 转换成命令行程序非常简单,下面介绍几种常用的方式。

1.1. 默认方式

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

import fire

def import_file(fp):
    print("IMPORT file from: {}".format(fp))

def export_file(fp):
    print("EXPORT file to: {}".format(fp))

if __name__ == "__main__":
    # fire默认会将所有函数转换成子命令
    fire.Fire()

然后,就可以通过子命令的方式执行导入导出功能。

$ python main.py import_file --fp ./path/xxx.csv
IMPORT file from: ./path/xxx.csv

$ python main.py export_file --fp ./path/xxx.csv
EXPORT file to: ./path/xxx.csv

函数的名称自动变为子命令的名称,函数的参数自动变成子命令的参数。

1.2. Fire

Fire库的默认方式会把所有的函数都转换为子命令,
如果只想导出一个函数的话,可以用 Fire<fn>的方式。

if __name__ == "__main__":
    # 只导出 import_file 函数作为子命令
    fire.Fire(import_file)

只导出一个函数的时候,执行命令的时候不需要输入子命令的名称。

$ python main.py --fp ./path/xxx.csv
IMPORT file from: ./path/xxx.csv

1.3. Fire

导出多个函数作为子命令时,默认是使用函数名作为子命令名称的,函数名称有时候会非常长,输入很麻烦。
这时,可以用 Fire<dict> 方式。

if __name__ == "__main__":
    # 子命令的名称分别是:import 和 export
    fire.Fire({
        "import": import_file,
        "export": export_file,
    })

执行时,使用简化的子命令名称。

$ python main.py import --fp ./path/xxx.csv
IMPORT file from: ./path/xxx.csv

$ python main.py export --fp ./path/xxx.csv
EXPORT file to: ./path/xxx.csv

这种方式非常灵活,不仅可以设置子命令名称,还可以控制需要导出哪些函数。

1.4. Fire

除了导出函数,Fire<object>方式也可以导出对象的公有方法。

import fire

class FileHandler():

    def __init__(self):
        pass

    def import_file(self, fp):
        print("IMPORT file from: {}".format(fp))

    def export_file(self, fp):
        print("EXPORT file to: {}".format(fp))

if __name__ == "__main__":
    fh = FileHandler()
    fire.Fire(fh)

使用方式如下:

$ python main.py import_file --fp ./path/xxx.csv
IMPORT file from: ./path/xxx.csv

$ python main.py export_file --fp ./path/xxx.csv
EXPORT file to: ./path/xxx.csv

使用对象的方式没有直接使用函数那么简单,但有个好处是可以在初始化时传入一些状态。

import fire
import os

class FileHandler():

    def __init__(self, folder=""):
        self.folder = folder

    def import_file(self, fp):
        print("IMPORT file from: {}".format(os.path.join(self.folder, fp)))

    def export_file(self, fp):
        print("EXPORT file to: {}".format(os.path.join(self.folder, fp)))

if __name__ == "__main__":
    # 设置了默认文件夹,使用时直接传入文件名即可
    fh = FileHandler("./default_path")
    fire.Fire(fh)

$ python main.py import_file --fp xxx.csv
IMPORT file from: ./default_path/xxx.csv

$ python main.py export_file --fp xxx.csv
EXPORT file to: ./default_path/xxx.csv

1.5. Fire

Fire<class>的方式也可以直接作用在类上,不用初始化对象。

if __name__ == "__main__":
    fire.Fire(FileHandler)

和 Fire<object> 不同的是,__init__方法的参数也变成了命令的参数,也可以在命令行中调整了。

$ python main.py import_file --fp xxx.csv
IMPORT file from: xxx.csv

$ python main.py import_file --fp xxx.csv --folder ./my_folder
IMPORT file from: ./my_folder/xxx.csv


2. 组合命令

当功能越来越多时,可能就会需要组合一些功能一起运行,省得输入一个一个的子命令。

class FileHandler():

    def __init__(self, folder="./defalut_dir"):
        self.folder = folder

    def import_file(self, fp):
        print("IMPORT file from: {}".format(os.path.join(self.folder, fp)))

    def export_file(self, fp):
        print("EXPORT file to: {}".format(os.path.join(self.folder, fp)))

class DatabaseHandler():

    def __init__(self, src="aliyun-mysql", dst="tecent-mysql"):
        self.src = src
        self.dst = dst

    def import_db(self):
        print("IMPORT data from: {} to: {}".format(self.src, self.dst))

    def export_db(self):
        print("EXPORT data from: {} to: {}".format(self.src, self.dst))

# 组合 FileHandler 和 DatabaseHandler
class ComposeHandler():
    def __init__(self):
        self.fh = FileHandler()
        self.dh = DatabaseHandler()

    def import_all(self, fp):
        self.fh.import_file(fp)
        self.dh.import_db()


    def export_all(self, fp):
        self.fh.export_file(fp)
        self.dh.export_db()

if __name__ == "__main__":
    fire.Fire(ComposeHandler)


导出组合命令之后,不仅可以执行组合命令,也可以只执行子命令。

$ python main.py import_all --fp xxx.csv
IMPORT file from: ./defalut_dir/xxx.csv
IMPORT data from: aliyun-mysql to: tecent-mysql

$ python main.py export_all --fp xxx.csv
EXPORT file to: ./defalut_dir/xxx.csv
EXPORT data from: aliyun-mysql to: tecent-mysql

$ python main.py fh export_file --fp xxx.csv
EXPORT file to: ./defalut_dir/xxx.csv

$ python main.py dh export_db
EXPORT data from: aliyun-mysql to: tecent-mysql

3. 链式命令

链式命令和组合命令不一样的地方在于:
组合命令中,每个命令之间一般是相互独立的,
而链式命令中,上一个命令的执行结果会对下一个命令造成影响。
比如:

class Stat():
    def __init__(self):
        self.total = 0
        self.avg = 0
        self.n = 0

    # 模拟统计合计值
    def sum(self, n):
        self.n += n
        for i in range(n):
            self.total += i

        return self

    # 模拟求平均值
    def average(self):
        if self.n == 0:
            self.avg = 0
        else:
            self.avg = self.total / self.n

        return self

    # 显示分析结果
    def show(self):
        print("SUM: {}, and AVERAGE: {}".format(self.total, self.avg))

if __name__ == "__main__":
    fire.Fire(Stat)

执行链式命令时,可以先求和,再求平均值,最后显示结果:

$ python main.py sum 10 average show
SUM: 45, and AVERAGE: 4.5

因为是链式命令,所以可以多次执行:

$ python main.py sum 10 sum 10 average show
SUM: 90, and AVERAGE: 4.5

$ python main.py sum 10 sum 20 sum 30 average show
SUM: 670, and AVERAGE: 11.166666666666666


4. 复杂命令参数

上面的示例中,参数都是简单的数据类型,比如字符串,数字之类的。

最后,介绍下复杂的命令参数如何使用,所谓复杂的参数,就是元组,列表,字典等等。

def hello(data):
    tp = type(data).__name__
    if  tp == "tuple" or tp == "list":
        for item in data:
            print("hello: {}".format(item))

    if tp == "dict":
        for k, v in data.items():
            print("hello: key {}, val {}".format(k, v))

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

python是弱类型语言,函数的参数可以是任何类型。
主要看看命令行中如何传入复杂的类型:

$ python main.py "(aa, bb, cc)"
hello: aa
hello: bb
hello: cc

$ python main.py "[aa, bb, cc]"
hello: aa
hello: bb
hello: cc

$ python main.py "{aa: 11, bb: 22}"
hello: key aa, val 11
hello: key bb, val 22

5. 总结

Python的Fire库是一个构思非常巧妙的命令行接口库,各种语言的命令行接口我接触过不少,还没有在其他编程语言中看到过类似的库。

Fire库最方便的地方在于,你不用再关心命令行的参数(参数的解析一直是命令行程序中最让人头疼的地方),只要专注于自己要实现的功能。
此外,如果你已经有一些python脚本的话,通过这个库把它们改造成命令行程序也非常简单。

---------------------------END---------------------------

题外话

当下这个大数据时代不掌握一门编程语言怎么跟的上脚本呢?当下最火的编程语言Python前景一片光明!如果你也想跟上时代提升自己那么请看一下.

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。


👉优快云大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述
👉 优快云大礼包:gift::[全网最全《Python学习资料》免费赠送:free:!](https://blog.youkuaiyun.com/weixin_68789096/article/details/132275547?spm=1001.2014.3001.5502) (安全链接,放心点击)

若有侵权,请联系删除

Python简化命令行界面库之fire使用详解 在开发命令行工具时,开发者通常需要编写大量代码来解析命令行参数,这既耗时又容易出错。Python Fire 是 Google 开源的一个库,旨在简化命令行界面的开发。它可以将任何 Python 对象自动生成一个命令行界面,从而大大减少了开发时间和代码复杂度。本文将详细介绍 Python Fire 库,包括其安装方法、主要特性、基本和高级功能,以及实际应用场景,帮助全面了解并掌握该库的使用。 阅读详情

相关推荐

python如何快速创建命令行接口(CLI)

在这个示例中,我们通过 @click.group() 装饰器创建了一个命令组 cli(),它包含了两个命令 initdb() 和 dropdb()。在这个示例中,我们首先导入 Click 库并定义了一个名为 hello() 的函数,使用 @click.command() 装饰器将其声明为命令行工具。然后,我们使用 @click.option() 装饰器定义了一个命令行选项 --name,它需要一个值,可以通过提示输入。当我们在命令行中运行这个程序时,会出现一个提示,要求输入 --name 选项的值。

zhangzhechun的专栏 1157

python fire库的使用

一. 介绍 fire是python中用于生成命令行界面(Command Line Interfaces, CLIs)的工具,不需要做任何额外的工作,只需要从主模块中调用fire.Fire(),它会自动将你的代码转化为CLI,Fire()的参数可以说任何的python对象 二. 安装 pip install fire 三. 用法 实例1 单个函数:python 模块名 参...

anywen5590的博客 1239

Anaconda镜像源切换全攻略:从清华源到恢复默认设置的完整流程

本文详细介绍了Anaconda镜像源的管理与优化,重点讲解了如何配置清华源以提升国内下载速度。内容涵盖镜像源工作原理、清华源详细配置步骤、多源管理策略、常见问题排查以及如何安全恢复默认设置,帮助用户构建完整的镜像源管理体系。

weixin_28828243的博客 1020

fire库:实现直接用命令行调用Python函数、类、模块、对象

本文介绍fire库:实现直接用命令行调用Python函数、类、模块、对象

诸神缄默不语的博客 1034

R语言,charls数据库清洗、基线特征描述、logistics回归、rcs模型、森林图

【代码】R语言,charls数据库清洗、基线特征描述、logistics回归、rcs模型、森林图。

2402_87751128的博客 2510

B0505S选型

    使用B0505S-1W已经有一段时间了,一直以来使用的是下面的电路,该电路摘自《CAN总线嵌入式开发——从入门到实战》一书。 参考金升阳的用户手册,手册上写道: 为了确保该模块能够高效可靠的工作,使用时,其输出最小负载不能小于额定负载的10%。若您所需功率确实较小,请在输出端并联一个电阻(电阻消耗功率与实际使用功率之和大于等于10%的额定功率)        由于使用该电源模...

动感小麦兜的博客 1万+

谷歌开源 Python Fire:可自动生成命令行接口

选自Google Open Source 今天我们很高兴地宣布 Python Fire 开源。Python Fire 可从任何 Python 代码生成命令行接口(command line interfaces (CLIs)),简单地调用任意 Python 程序中的 Fire 函数以将那个程序自动地转化为 CLI。该库可通过 `pip install fire` 从 pypi

xfyangle的博客 850

QT编程之PCM音频播放与采集

Qt5/Qt6通用方案。

深之JohnChen的专栏 1166

Python编程:fire库自动生成命令行接口

命令行接口(Command Line Interface,简称CLI) # -*- coding: utf-8 -*- # @File : fire_CLI_demo.py # @Date : 2018-06-03 import fire class Person(object): def hello(self, name=&quot;world&quot;): print...

彭世瑜的博客 1589

AUTOSAR从入门到精通-复杂设备驱动(CDD)

CDD是复杂设备驱动的首字母缩写主要为驱动程序或复杂驱动程序,但不限于驱动程序。复杂驱动程序是一种未被AUTOSAR标准化的软件实体,可以通过AUTOSAR接口和/或基本软件模块api访问。 CDD是位于基础软件复杂驱动层的特定模块,与标准BSW模块或Rte交互。 CDD可能需要与分层软件体系结构的模块连接 分层软件架构的模块可能需要连接到CDD CDD可能需要通过Rte连接swc。

getusushu的博客 4191

(14-3)值分布式算法:QR-DQN (Quantile Regression DQN)算法

QR-DQN(Quantile Regression DQN)是一种强化学习算法,它是深度 Q-网络(Deep Q-Network,DQN)的一个变种,旨在更好地处理值函数的不确定性。QR-DQN的实现步骤与传统的DQN类似,但在目标分布计算和损失函数方面有一些不同之处,这使得它能够更好地处理值函数的不确定性。QR-DQN(Quantile Regression DQN)算法的核心思想是将值函数表示为一个分布,而不是传统的单一值估计。在下面的内容中,将讲解一个使用QR-DQN算法的例子。

码农三叔 2052

python 命令接口_Python Fire: 一个可以自动生成命令行接口(CLI)的库

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。今天我们很高兴地发布了开源的Python Fire,Python Fire可以从任何Python代码生成命令行接口(Command Line Interface,简称CLI)。 只需在Python程序里调用Fire函数,该函数会自动将程序转化为命令行接口。Python Fire库可以通过pypi中的”pip...

weixin_39793638的博客 263

使用菱FX5U系列PLC实现以太网通信的具体方法示例

接下来,我们将创建一个简单的CPU通信功能,以实现与其他设备的以太网通信。在上述代码中,我们首先设置访问号,然后创建一个数据读取命令(M_READ)和一个数据写入命令(M_WRITE)。此外,在实际应用中,您还需要确保PLC和其他设备之间的网络连接正常,并且遵循相应的通信协议。在上述代码中,我们执行了数据读取命令,并将接收到的响应存储在M_RESPONSE变量中。通过简单CPU通信功能,菱FX5U系列PLC可以实现与其他设备的以太网通信。我们将提供相应的源代码和详细的说明,以帮助您轻松实现这一功能。

DevCyberX的博客 1525

神奇的模块--谷歌开源 Python Fire:自动生成命令行接口

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34408717的博客 148

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Python的4个命令补全工具

Python的4个命令补全工具

派森的博客 2790

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

python 命令接口_这个Python库要火!可自动生成命令行接口

如果现在有个工具,不需要你做任何额外工作,不必定义参数、设置帮助信息或写一个主函数定义代码如何运行,就能自动把你的代码转化成一个 CLI 的工具,你想要么?没错,说的就是 Python Fire,通过它,你只需从主模块调用 Fire 函数,Python Fire 会接管剩下的一切。它使用检索将任何 Python 对象(无论是类、对象、字典、函数,甚至是整个模块)转化为命令行接口,并输出标注标签和文...

weixin_33508272的博客 273

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

命令行接口工具 Fire [Python编程更加简洁]

1 什么是命令行接口? 参考博客[1]: 大家使用最多的命令行工具应该是pip了,pip提供了很多的命令行参数和选项,我们在终端使用pip install --help命令可以查看install子命令的帮助文档。 命令行接口通常以可执行文件的名称开头。我们只需在控制台中输入它的名称,然后访问脚本的主入口点,例如pip。 我们可以通过命令行,将参数传递给脚本,它们可以是: •Arguments (参数):这是传递给脚本的必需参数。如果您不提供它,则CLI会遇到错误。例如,pandas是此命令中的参数:

Yana_Zeng的博客 1546

python编程命令_Python编程者福音——命令行接口工具fire

大家使用最多的命令行工具应该是pip了,pip提供了很多的命令行参数和选项,我们在终端使用pip install --help命令可以查看install子命令的帮助文档。可以看到,除了最常用的pip install package命令,我们还可以附加很多可选选项来控制pip install命令的行为。例如:-r选项可以指定从一个requirements.txt的文件安装Python依赖包,--no...

weixin_39628339的博客 325

Python Fire让命令行接口开发变得简单

Python Fire是一个强大的工具,使得为Python程序创建命令行接口变得非常简单。无需手动解析命令行参数,只需编写函数或类,Python Fire将自动生成命令行接口。这使得与Python程序交互更加便捷,让您的工具和脚本变得更加友好和易用。无论是开发命令行工具、自动化脚本还是希望为Python程序添加交互性,Python Fire都是一个强大的工具,值得一试。

z099164的博客 1236

python制作命令行工具——fire

一、快速介绍 来一波官方介绍。 Python Fire是一个库,用于从任何Python对象自动生成命令行接口。 是用python创建CLI的一种简单方法。 是开发和调试Python代码的一个有用工具。 Python Fire帮助探索现有代码或将其他人的代码转换为CLI。 使得Bash和Python之间的转换更加容易。 通过使用已经导入和创建的模块和变量来设置REPL, Python Fire使使用Python REPL变得更容易。 没听懂 ??? 不是太明白 ??? 不要紧,看完本篇就懂了

pythonputao的博客 647

Python 命令行工具:fire (已验证)

fire可以根据任何 Python 对象自动生成命令行接口。能以简单的方式生成 CLI是一个开发和调试 Python 代码的实用工具能将现存代码或别人的代码转换为 CLI使得在 Bash 和 Python 间的转换变得更容易通过预先为 REPL 设置所需的模块和变量,使得实用 REPL 更加容易。...

u010075995的博客 1826
上一篇: 深入理解 python 虚拟机:生成器停止背后的魔法
下一篇: Python自动化测试 环境搭建 Selenium、WebDriver下载、安装、配置、基本使用详解
Python_P叔
博客等级 码龄3年 5446粉丝 827原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值