剧照 | 《仙剑奇侠传》
前言
在前面三篇介绍 的文章中,我们全面了解了 的能力,相信不少小伙伴们都已经摩拳擦掌,想要打造一个属于自己的命令行工具。
本文将以我们日常工作中最常见的 命令为例,讲解如何使用 库来实现一个真正可用的命令行程序。
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
感谢创作者的好文
领取专属 10元无门槛券
私享最新 技术干货