开云-Python 命令行之旅:使用 click 实现 git 命令

Python 号令行之旅:利用 click 实现 git 号令 时候:2024-12-13 21:14:09 手机看文章

扫描二维码随时随地手机看文章

1、媒介

在前面五篇介绍 click的文章中,我们周全领会了 click的壮大能力。依照老例,我们要像利用 argparse和 docopt一样利用 click来实现 git 号令。

本文的存眷点其实不在 git的各类号令是若何实现的,而是怎样利用 click去打造一个适用号令行法式,代码布局是如何的。是以,和 git相干的操作,将会利用 gitpython库来简单实现。

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

本系列文章默许利用 Python 3 作为注释器进行讲授。若你仍在利用 Python 2,请留意二者之间语法和库的利用差别哦~
2、git 经常使用号令

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

git status

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

git add [pathspec [pathspec ...]]

然后利用以下号令提交信息:

git commit -m "your commit message" 

最后利用以下号令将提交推送到长途仓库:

git push

我们将利用 click和 gitpython库来实现这 4 个子号令。

3、关在 gitpython

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

安装:

pip install gitpython
4、思虑

在实现前,我们无妨先思虑下会用到 click的哪些功能?全部法式的布局是如何的?

click

git的 4 个子号令的实现其实对应在四个函数,每一个函数利用 click的 command来装潢。而对 git add和 git commit,则别离需要暗示参数的 click.argument和暗示选项的 click.option来装潢。

法式布局

法式布局上:

实例化 Git对象,供全局利用 界说 cli函数作为号令组,也就是全部号令法式的进口 界说四个号令对应的实现函数 status、add、commit、push

则根基布局以下:

import os import click from git.cmd import Gitgit = Git(os.getcwd()) @click.group() def cli(): """ git 号令行 """ pass @cli.command() def status(): """ 处置 status 号令 """ pass @cli.command() @click.argument('pathspec', nargs=-1) def add(pathspec): """ 处置 add 号令 """ pass @cli.command() @click.option('-m', 'msg') def commit(msg): """ 处置 -m号令 """ pass @cli.command() def push(): """ 处置 push 号令 """ pass if __name__ == '__main__': cli()

下面我们将一步步地实现我们的 git法式。

5、实现

假定我们在 click-git.py 文件中实现我们的 git法式。

5.1 status 子号令

status子号令不接管任何参数和选项,是以其实现函数只需 cli.command()装潢。

@cli.command() def status(): """ 处置 status 号令 """ cmd = ['git', 'status'] output = git.execute(cmd) click.echo(output)

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

5.2 add 子号令

add子号令相对 status子号令,需要接管肆意个 pathspec 参数,是以增添一个 click.argument装潢器,而且在 add函数中需要增添同名的 pathspec入参。经 click处置后的 pathspec实际上是个元组,和列表相加前,需要先转换为列表。

@cli.command() @click.argument('pathspec', nargs=-1) def add(pathspec): """ 处置 add 号令 """ cmd = ['git', 'add'] + list(pathspec) output = git.execute(cmd) click.echo(output)

当我们履行 python3 click-git.py add --help时,成果以下:

Usage: click-git.py add [OPTIONS] [PATHSPEC]... 处置 add 号令Options: --help Show this message and exit.

既然 git add能接管肆意多个 pathspec,那末 add(pathspec)的参数其实改成复数情势更加适合,但我们又但愿帮忙信息中是单数情势,这就需要额外指定 metavar,则有:

@cli.command() @click.argument('pathspecs', nargs=-1, metavar='[PATHSPEC]...') def add(pathspecs): """ 处置 add 号令 """ cmd = ['git', 'add'] + list(pathspecs) output = git.execute(cmd) click.echo(output)
5.3 commit 子号令

add子号令相对 status子号令,需要接管 -m选项,是以增添一个 click.option装潢器,指定选项名称 msg,而且在 commit函数中增添同名入参。

@cli.command() @click.option('-m', 'msg') def commit(msg): """ 处置 -m号令 """ cmd = ['git', 'commit', '-m', msg] output = git.execute(cmd) click.echo(output)
5.4 push 子号令

push子号令同 status子号令一样,不接管任何参数和选项,是以其实现函数只需 cli.command()装潢。

@cli.command() def push(): """ 处置 push 号令 """ cmd = ['git', 'push'] output = git.execute(cmd) click.echo(output)

至此,我们就实现了一个简单的 git号令行,利用 python click-git.py status即可查询项目状况。

很是便利的是,每一个号令函数的 docstring都将作为这个号令的帮忙信息,是以,当我们履行 python3 click-git.py --help会主动生成以下帮忙内容:

Usage: click-git.py [OPTIONS] COMMAND [ARGS]... git 号令行Options: --help Show this message and exit.Commands: add 处置 add 号令 commit 处置 -m号令 push 处置 push 号令 status 处置 status 号令

想看全部源码,请戳 click-git.py 。

6、小结

本文简单介绍了平常工作中经常使用的 git号令,然后提出实现它的思绪,终究一步步地利用 click和 gitpython实现了 git法式。

对照 argparse和 click的实现版本,你会发现利用 click来实现变得特定简单:

相较在 argparse,子解析器、参数类型甚么的十足不需要关心 相较在 docopt,参数解析和号令挪用处置也不需要关心

这无疑是 click最年夜的优势了。

关在 click的讲授将告一段落,回首下 click的至简之道,你会爱上它。

此刻,你已学会了三个号令行解析库的利用了。但你觉得这就够了吗?click已够简单了吧,够直接了吧?但它依然不是最简单的。

鄙人篇文章中,将为大师介绍一个由谷歌出品的在 Python 界很火的号令行库 —— fire。

欲知详情,请下载word文档 下载文档

上一篇:开云-学习Fusion 下一篇:开云-处理器