首页 > 编程语言 >Python Fire:自动生成命令行接口

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

时间:2023-08-15 20:56:52浏览次数:49  
标签:__ fp 命令行 Python self Fire file import def

  1. 首先创建一个 student_file.py
  2. pip install fire
  3. 使用 Fire 转换成命令行程序

 

1. 默认方式

import fire  


def import_file(fp):
    print("函数1打印结果: {}".format(fp))


def export_file(fp):
    print("函数2打印结果: {}".format(fp))


if __name__ == "__main__":
    fire.Fire()
    # 终端输入: python student_file.py import_file --fp ./path/xxx.csv
    # 终端输入: python student_file.py export_file --fp ./path/xxx.csv

  

执行结果:

 

2. Fire<fn>

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

 

import fire


def import_file(fp):
    print("函数1打印结果: {}".format(fp))


def export_file(fp):
    print("函数2打印结果: {}".format(fp))


if __name__ == "__main__":
    fire.Fire(import_file)
    # 终端输入: python student_file.py --fp ./path/xxx.csv

  

执行结果:

 

3. Fire<dict>

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

import fire


def import_file(fp):
    print("函数1打印结果: {}".format(fp))


def export_file(fp):
    print("函数2打印结果: {}".format(fp))


if __name__ == "__main__":
    # 子命令的名称分别是:name和 age
    fire.Fire({
        "name": import_file,
        "age": export_file,
    })
    # 终端输入: python student_file.py name --fp ./path/xxx.csv
    # 终端输入: python student_file.py age --fp ./path/xxx.csv

 

执行结果:

 

4. Fire<object>

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

import fire

class FileHandler:

    def import_file(self, fp):
        print("类里函数1打印结果: {}".format(fp))

    def export_file(self, fp):
        print("类里函数2打印结果: {}".format(fp))


if __name__ == "__main__":
    fh = FileHandler()
    fire.Fire(fh)
    # 终端输入: python student_file.py import_file --fp ./path/xxx.csv
    # 终端输入: python student_file.py export_file --fp ./path/xxx.csv

  

执行结果:

 

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

 
import fire


class FileHandler:

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

    def import_file(self, fp):
        print("类里函数1打印结果: 你的名字是{}你的年龄是{}".format(self.folder, fp))

    def export_file(self, fp):
        print("类里函数2打印结果: 你的名字是{}你的年龄是".format(self.folder, fp))


if __name__ == "__main__":
    fh = FileHandler("python")
    fire.Fire(fh)
    # 终端输入: python student_file.py import_file --fp 25
    # 终端输入: python student_file.py export_file --fp 25

  

执行结果:

 

5. Fire<class>

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

import fire


class FileHandler:

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

    def import_file(self, fp):
        print("类里函数1打印结果: 你的名字是{}你的年龄是{}".format(self.folder, fp))

    def export_file(self, fp):
        print("类里函数2打印结果: 你的年龄是{}".format(fp))


if __name__ == "__main__":
    fire.Fire(FileHandler)
    # 终端输入: python student_file.py import_file --fp 25 --folder python
    # 终端输入: python student_file.py export_file --fp 25 --folder python

  

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

执行结果:

 

6. 组合命令

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

import fire


class FileHandler:

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

    def import_file(self, fp):
        print("import_file: 姓名{}, fp{}".format(self.folder, fp))

    def export_file(self, fp):
        print("export_file: 姓名{}, fp{}".format(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("数据库db: {} to: {}".format(self.src, self.dst))

    def export_db(self):
        print("数据库export_db: {} to: {}".format(self.src, self.dst))


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

    def import_all(self, fp):
        self.fhfh.import_file(fp)
        self.dhdh.import_db()

    def export_all(self, fp):
        self.fhfh.export_file(fp)
        self.dhdh.export_db()


if __name__ == "__main__":
    fire.Fire(ComposeHandler)
    # 终端输入: python student_file.py import_all --fp 22
    # 终端输入: python student_file.py export_all --fp 22
    # 导出组合命令之后,不仅可以执行组合命令,也可以只执行子命令
    # 终端输入: python student_file.py fhfh export_file --fp 22
    # 终端输入: python student_file.py dhdh export_db

  

 执行结果:

 

7.链式命令

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

import fire


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

    def sum(self, a):
        self.n += a
        return self

    def average(self):
        self.avg = self.n / self.num
        return self

    def show(self):
        print("和是:{}, and 平均值是:{}".format(self.n, self.avg))


if __name__ == "__main__":
    fire.Fire(Stat)
    # 终端输入:  python student_file.py sum 10 average show
    # 因为是链式命令,所以可以多次执行:
    # python student_file.py sum 10 sum 20 sum 30 average show

  

 执行结果:

 

8.复杂命令参数

 复杂的命令参数如何使用,复杂的参数,就是元组,列表,字典等等

import fire


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

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


if __name__ == "__main__":
    fire.Fire(hello)
    # 终端输入:  python student_file.py "(aa, bb, cc)"
    # 终端输入:  python student_file.py "[aa, bb, cc]"
    # 终端输入:  python student_file.py "{aa: 11, bb: 22}

  

  执行结果:

 

标签:__,fp,命令行,Python,self,Fire,file,import,def
From: https://www.cnblogs.com/pywen/p/17632340.html

相关文章

  • Python用PyMC贝叶斯GLM广义线性模型、NUTS采样器拟合、后验分布可视化
    全文链接:https://tecdat.cn/?p=33436原文出处:拓端数据部落公众号尽管贝叶斯方法相对于频率主义方法的理论优势已经在其他地方进行了详细讨论,但其更广泛采用的主要障碍是“可用性”。而使用贝叶斯方法,客户可以按照自己认为合适的方式定义模型。线性回归在此示例中,我们将帮助客......
  • python的websocketAPP
    一.websocket简介及安装使用pip命令安装websocket库:pip3installwebsocketwebsocket.WebSocketApp 是对 websocket.WebSocket 的封装,支持自动定时发送PING帧,支持事件驱动方式的数据帧接收,可用于长期的WebSocket连接。websocket中就有建立连接connect、发送消息send等函......
  • Python | 文件、异常模块与包
    1.文件1.1文件编码编码就是一种规则集合,记录了内容和二进制间进行相互转换的逻辑。计算机常用编码:UTF-8GBKBig5UTF-8是目前全球通用的编码格式除非有特殊需求,否则,一律以UTF-8格式进行文件编码即可。1.2文件的读取操作一般,文件可以分为文本文件、视频文件、音频......
  • Python小项目:利用tkinter与图灵机器人制作智能聊天系统
    文章目录1前言2代码分模块讲解2.1导入相应的库2.2创建机器人对象2.3创建信息交互过程对象2.4页面创建对象3整体代码4结语1前言在本项目中,我们将探索如何使用Python的tkinter库以及图灵机器人API来构建一个智能聊天系统。本项目的初衷是通过实际操作,结合GUI编程和API调用......
  • Python小项目:利用tkinter搭建粗糙集简约算法软件
    文章目录1前言2粗糙集简约算法简述2.1基本概念2.2算法原理2.3应用领域3实验详解3.1实验数据3.2实验说明及过程截图3.3实验结果4代码详解5结语完整项目下载:下载链接1前言在本次旅程中,我们将探索一个令人兴奋的主题——“Python小项目:利用tkinter搭建粗糙集简约算法软件......
  • Python小项目:利用 U-net 完成细胞图像分割
    文章目录1前言2实验概述3U-net概述4实验过程及代码5结语完整数据集下载:下载链接1前言在当今数字化时代,图像处理和分析已经成为了科学研究和技术应用领域的关键部分。在生物医学领域,图像分析对于诊断、治疗和疾病研究具有重要意义。本项目将带您深入了解U-net细胞分割技......
  • Python小项目:利用tkinter搭建个人所得税计算器
    文章目录1前言2详细介绍3代码介绍4结语完整项目下载:下载链接1前言在当今数字化时代,个人所得税的计算对于每个人来说都是一个重要而复杂的任务。为了让个人所得税的计算变得更加便捷和直观,本实验采用了Python编程语言,并借助tkinter图形化界面库,搭建了一个实用的个人所得......
  • Python小项目:利用tkinter开发测手速小游戏
    文章目录1简介2代码分模块介绍2.1导入需要的包2.2定义全局变量2.3定义页面组件类2.4定义增加类2.5定义结束类3整体代码展示4结语1简介利用tkinter开发测手速的小游戏,大家10s内可以点击鼠标多少次呢?想测试一下吗?来试试测手速下游戏吧!仅供娱乐!试玩视频:测手速小游戏游......
  • Python小项目:利用tkinter开发AI对战井字棋游戏
    文章目录1前言2代码分模块介绍2.1导入需要的库2.2定义全局变量2.2定义玩家类2.3定义页面类2.4定义页面变化类以及玩家与AI轮流转换下子权限2.5定义判断胜负类2.6定义智能AI下子类3整体代码4结语完整项目下载:下载链接1前言在数字的世界里,古老的棋盘游戏焕发出崭新的活......
  • Python小项目:通过商品条形码查询商品信息
    文章目录1商品条形码2查询商品条形码的目的3实现步骤及代码3.1爬取网站介绍3.2python代码实现3.2.1日志模块3.2.2查询模块3.2.3运行结果4结语完整项目下载:下载链接1商品条形码平日大家会购买许许多多的商品,无论是饮料、食品、药品、日用品等在商品的包装上都会有条形码......