首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

剧照 | 《仙剑奇侠传》

前言

在前面三篇介绍 的文章中,我们全面了解了 的能力,相信不少小伙伴们都已经摩拳擦掌,想要打造一个属于自己的命令行工具。

本文将以我们日常工作中最常见的 命令为例,讲解如何使用 库来实现一个真正可用的命令行程序。

git 常用命令

大家不妨回忆一下,平时最常使用 子命令都有哪些?

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

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

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

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

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

关于 gitpython

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

安装:

思考

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

argparse

要实现子命令,那么之前介绍到的 必不可少

当用户键入子命令时,子命令所对应的子解析器需要作出响应,那么需要用到子解析器的 功能

针对 ,我们需要实现位置参数,而且数量是任意个

针对 或 ,我们需要实现选项参数,且即可长选项,又可短选项

程序结构

命令行程序需要一个 函数来作为统一的入口,它负责构建解析器,并解析命令行参数

我们还需要四个 函数响应对应的子命令

则基本结构如下:

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

实现

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

构建解析器

我们需要构建一个父解析器,作为程序的根解析器,程序名称指定为 。然后在上面添加子解析器,为后续的子命令的解析做准备:

中的 和 参数主要用于命令行帮助信息,最终的效果如下:

status 子命令

我们需要在 函数中添加一个用于解析 命令的子解析器 ,并指定其对应的处理函数为 。

需要说明的是,在 函数中,能接收任意名称的关键字参数,这个参数值会存放于父解析器解析命令行参数后的变量中。

比如,在本文示例程序中,我们为每个子解析器定义了 ,那么 中的 将具有 属性,我们传入不同的子命令,那么这个 就是不同的响应函数。

定义了 的子解析器后,我们再实现下 即可实现 命令的响应:

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

你可能会对 的函数签名感到困惑,这里的 和 是怎么传入的呢?这其实是由我们自己控制的,将在本文最后讲解。

add 子命令

同样,我们需要在 函数中添加一个用于解析 命令的子解析器 ,并指定其对应的处理函数为 。

额外要做的是,要在子解析器 上添加一个 位置参数,且其数量是任意的:

然后,就是实现 函数,我们需要用到表示文件路径的 :

commit 子命令

同样,我们需要在 函数中添加一个用于解析 命令的子解析器 ,并指定其对应的处理函数为 。

额外要做的是,要在子解析器 上添加一个 / 选项参数,且要求必填:

然后,就是实现 函数,我们需要用到表示提交信息的 :

push 子命令

同样,我们需要在 函数中添加一个用于解析 命令的子解析器 ,并指定其对应的处理函数为 。

它同 子命令的实现方式一致:

然后,就是实现 函数,和 类似:

解析参数

在定义完父子解析器,并添加参数后,我们就需要对参数做解析,这项工作也是实现在 函数中:

通过 实例化出 对象,用来和 仓库交互

通过 解析命令行

通过 判断是否输入了子命令。

由于每个子解析器都定义了 ,那么如果当用户在命令行不输入任何命令时, 就没有 属性,那么我们就输出帮助信息

如果用户输入了子命令,那么就调用 ,传入 和 对象,用以处理对应命令

至此,我们就实现了一个简单的 命令行,使用 查看帮助如下:

然后我们就可以愉快地使用亲手打造的 程序啦!

小结

本文简单介绍了日常工作中常用的 命令,然后提出实现它的思路,最终一步步地使用 和 实现了 程序。是不是很有成就感呢?

关于 的讲解将告一段落,回顾下 的四步曲,加上今天的内容,感觉它还是挺清晰、简单的。不过,这还只是打开了命令行大门的一扇门。

你是否想过, 的四步曲虽然理解简单,但略微麻烦。有没有更简单的方式?如果我很熟悉命令行帮助语法,我能不能写个帮助字符串就把所有的命令行元信息给定义出来?然后就直接轻松愉快地获取解析后的参数信息呢?

在下篇文章中,将为大家讲解另一个站在一个全新的思路,又无比强大的库 。

References

gitpython:https://gitpython.readthedocs.io/en/stable/intro.html

argparse-git.py:https://github.com/HelloGitHub-Team/Article/blob/master/contents/Python/cmdline/argparse-git.py

argparse-git.py:https://github.com/HelloGitHub-Team/Article/blob/master/contents/Python/cmdline/argparse-git.py

感谢创作者的好文

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191014A0KYSU00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券