接下来,我将用argparse命令行模拟一些git的常用指令。
首先常用的git指令有:
git status
git add xxxxxx
git commit
git push
这就需要用到gitpython库和argparse中的嵌套解析器等方法。
首先下载gitpython库 pip install gitpython
下载好之后,使用 from git.cmd import Git 导入gitpython库
实际上我们并不是直接实现git指令的功能,而是运用argparse进行指令解析,将解析后的结果传入gitpython的Git这个实例中完成的·。
可想而知的是我们需要四个与gitpython这个第三方库传参的handle函数
接下来可以先写好四个处理函数,相信之后会用得到:
def handle_status(git, args):
pass
def handle_add(git, args):
pass
def handle_commit(git, args):
pass
def handle_push(git, args):
pass
这里为什么有两个参数git和args呢?
这里的git是Git库的git对象,而args是我们通过parser.parse_args()
解析猪来的命令行。
因为是需要嵌套解析器,所以构造总的解析器部分可以这么写:
parser = argparse.ArgumentParser(prog='git', description="My git Cmd")
subparser = parser.add_subparsers(
title='These are common Git commands used in various situations',
metavar='command')
然后是构造status的解析器:
statusparser = subparser.add_parser('status',help='show the working tree status')
statusparser.set_defaults(handle=handle_status)
这里的set_default的解释,原文是:Namespace default accessor method ,参考翻译以及结合网上的解释:
能接收任意名称的关键字参数,这个参数值会存放于父解析器解析命令行参数后的变量中。
比如,在本文示例程序中,我们为statusparser子解析器定义了 handle
,那么 args = parser.parse_args()
中的 args
将具有 handle
属性,我们传入不同的子命令,那么这个 handle
就是不同的响应函数。
也就是说,我们给parser增加了一个新属性叫‘handle’,并且我们给这个新属性赋值‘handle_status’
当然,按照这个set_default的字面意思,我们也可以设置原有的一些参数的默认值
仿照status指令,接下来的三个指令也都可以仿照:
addparser = subparser.add_parser('add', help='add file contents to the index')
addparser.add_argument('path',help='files to add content from', nargs='*')
addparser.set_defaults(handle=handle_add)
commitparser = subparser.add_parser('commit', help='Record changes to the repository')
commitparser.add_argument('--message', '-m', help='Use the given as the commit message',
metavar='msg', required=True)
commitparser.set_defaults(handle=handle_commit)
pushparser = subparser.add_parser('push', help='Update remote refs along with associated objects')
pushparser.set_defaults(handle=handle_push)
我们已经为每个子解析器建立了自己的handle,那么如何才能识别出个子指令呢?
git = Git(os.getcwd())
args = parser.parse_args()
if hasattr(args, 'handle'):
args.handle(git, args)
else:
parser.print_help()
git = Git()创建git的实例
args = parser.parse_args()导出命令行参数
hasattr(args,‘handle’)这个函数是用来检测解析器里的参数表中是否含有‘handle’属性,由于我们每个子指令都有‘handle’属性,如果监测到‘handle’,那么就执行每个子命令的handle_xxx函数,将args传给git。
其实很简单,就是将你原来如何使用git的那些指令传给git就可以了
def handle_status(git, args):
cmd = ['git', 'status']
output = git.execute(cmd)
print(output)
pass
def handle_add(git, args):
cmd = ['git', 'add'] + args.path
output = git.execute(cmd)
print(output)
pass
def handle_commit(git, args):
cmd = ['git', 'commit'] + args.message
output = git.execute(cmd)
print(output)
pass
def handle_push(git, args):
cmd = ['git', 'push']
output = git.execute(cmd)
print(output)
pass
最后我们验证一下
以上
https://mp.weixin.qq.com/s/o7wlp4EEkFGwN-snXU03aQ