Google 开源的 Python 命令行库:fire 实现 git 命令

发布时间:2024-12-13  


一、前言

在前面三篇介绍 fire的文章中,我们全面了解了 fire强大而不失简洁的能力。按照惯例,我们要像使用 argparse、docopt和 click一样使用 fire来实现 git 命令。

本文的关注点并不在 git的各种命令是如何实现的,而是怎么使用 fire去打造一个实用命令行程序,代码结构是怎样的。因此,和 git相关的操作,将会使用 gitpython库来简单实现。

为了让没读过 使用 xxx 实现 git 命令(xxx指 argparse、docopt和 click) 的小伙伴也能读明白本文,我们仍会对 git常用命令和 gitpython做一个简单介绍。

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

二、git 常用命令

当你写好一段代码或增删一些文件后,会用如下命令查看文件状态:

git status

确认文件状态后,会用如下命令将的一个或多个文件(夹)添加到暂存区:

git add [pathspec [pathspec ...]]

然后使用如下命令提交信息:

git commit -m "your commit message" 

最后使用如下命令将提交推送到远程仓库:

git push

我们将使用 fire和 gitpython库来实现这 4 个子命令。

三、关于 gitpython

gitpython[1] 是一个和 git仓库交互的 Python 第三方库。我们将借用它的能力来实现真正的 git逻辑。

安装:

pip install gitpython

四、思考

在实现前,我们不妨先思考下会用到 fire的哪些功能?整个程序的结构是怎样的?

fire

git的 4 个子命令的实现其实对应于四个函数,我们可以都放到一个类中,实现四个实例方法。而对于 git add命令,需要接受任意个参数,在实例方法中用 *pathspecs参数来表达。对于 git commit命令,需要接受 -m选项,在实例方法中用 m参数来表达。

程序结构

程序结构上:

  • 实例化 Git对象,供全局使用
  • GitCli类中定义四个命令对应的实例方法 status、add、commit、push

则基本结构如下:

import os import fire from git.cmd import Git

git = Git(os.getcwd()) class GitCli: def status(self): """
        处理 status 命令
        """ pass def add(self, *pathspecs): """
        处理 add 命令
        """ pass def commit(self, m): """
        处理 -m命令
        """ pass def push(self): """
        处理 push 命令
        """ pass if __name__ == '__main__':
    fire.Fire(GitCli())

下面我们将一步步地实现我们的 git程序。

五、实现

假定我们在 fire-git.py[2] 文件中实现我们的 git程序。

5.1 status 子命令

status子命令不接受任何参数和选项,因此 status方法无需任何入参。

class GitCli: def status(self): """
        处理 status 命令
        """ cmd = ['git', 'status']
        output = git.execute(cmd) return output

不难看出,我们最后调用了真正的 git status来实现,并打印了输出。

5.2 add 子命令

add子命令相对于 status子命令,需要接受任意个 pathspec 参数,因此 add方法需要增加 *pathspecs入参。fire 最终传入的是一个元组,我们需要将其转换成 list 以便后续处理。

class GitCli: def add(self, *pathspecs): """
        处理 add 命令
        """ cmd = ['git', 'add'] + list(pathspecs)
        output = git.execute(cmd) return output

当我们执行 python3 fire-git.py add --help时,结果如下:

INFO: Showing help with the command 'fire-git.py add -- --help'.

NAME
    fire-git.py add - 处理 add 命令

SYNOPSIS
    fire-git.py add [PATHSPECS]...

DESCRIPTION
    处理 add 命令

POSITIONAL ARGUMENTS
    PATHSPECS

5.3 commit 子命令

commit子命令相对于 status子命令,需要接受 -m选项,因此 commit方法需要增加 m入参。

class GitCli: def commit(self, m): """
        处理 -m命令
        """ cmd = ['git', 'commit', '-m', m]
        output = git.execute(cmd) return output

5.4 push 子命令

push子命令同 status子命令一样,不接受任何参数和选项,因此 push方法无需任何入参。

class GitCli: def push(self): """
        处理 push 命令
        """ cmd = ['git', 'push']
        output = git.execute(cmd) return output

至此,我们就实现了一个简单的 git命令行,使用 python fire-git.py status便可查询项目状态。

非常方便的是,每个命令函数的 docstring都将作为这个命令的帮助信息,因此,当我们执行 python3 fire-git.py --help会自动生成如下帮助内容:

INFO: Showing help with the command 'fire-git.py -- --help'.

NAME
    fire-git.py

SYNOPSIS
    fire-git.py COMMAND

COMMANDS
    COMMAND is one of the following:

     add
       处理 add 命令

     commit
       处理 -m命令

     push
       处理 push 命令

     status
       处理 status 命令

想看整个源码,请戳 fire-git.py[3]

六、小结

本文简单介绍了日常工作中常用的 git命令,然后提出实现它的思路,最终一步步地使用 fire和 gitpython实现了 git程序。

对比 argparse、docopt和 click的实现版本,你会发现使用 fire来实现是最简单的:

  • 相较于 argparse,子解析器、参数类型什么的统统不需要关心
  • 相较于 docopt,参数解析和命令调用处理也不需要关心
  • 相较于 click,装饰器所定义的命令行参数信息也必须要关心

无疑,fire把能简化的都简化了,简直就是懒人福音。

关于 fire的讲解将告一段落,回顾下 fire的至简之道,你会深爱上它。这也体现出了 Python 之美。

现在,你已学会了四个特点各异的主流命令行解析库的使用了,再也不需要为命令行程序的实现而烦恼了。

文章来源于:21IC    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    单独的python文件,命令行直接使用。【推荐】   https://github.com/laborer/stcflash   b. gSTCISP,一个带GUI的下载器,SourceForge提供源码下载......
    就依循开发流程来逐步说明之。 Step-1:从Github网页下载Diffusers源码首先访问这个Huggingface 网页( 图2),然后,按下”code”就自动把Diffusers 源码下载......
    下载minLoRA源码 ( 图2)。 图2 Github上的免费LoRA源码 然后,按下<code> 就自动把minLoRA 源码下载到本机里了。接着,把所下载的源代码压缩檔解开,放置......
    步骤完成之后,就可以编译,然后直接下载运行了,通过串口调试助手可以看见输出字符“Demo...”。 5工程及源码下载 为方便初学者,这里提供对应工程和源码,方便大家学习。 百度网盘: https......
    ://www.freertos.org/a00104.html 下载好源码,这里下载最新版202112.00; 添加源码到项目: 直接拷贝源码下的FreeRTOS文件夹到项目的lib目录中; 添加到项目编译 在lib......
    =Main_Page         mjpg-stream的移植需要jpeg的库,所以我们先移植jpeg的库 (1)jpeg库的移植         1)jpeg源码包通过下面这个网址下载......
    综合衡量了一下,移植 nr 作为后续项目的一个命令行交互。本篇文章分享一下小熊派移植 nr shell 的过程~ 二、代码下载 上 github 拉代码,开源仓库: github.com......
    )lwip API BSD API 2.LWIP源码下载 源码下载地址:LWIP源码 3 LWIP源码移植   这里以1.4.1为例。 1.解压文件 2.打开已完成DM9000驱动的工程,在工......
    ,查看STM32WB与手机端的数值是否相等。 硬件准备 首先需要准备一个开发板,这里我准备的是NUCLEO-WB55RG 的开发板: 源码下载 https://download.csdn.net......
    /programming_manual/pm0271-stm32wb-ble-stack-programming-guidelines-stmicroelectronics.pdf 源码下载 https......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>