[学习]探究python命令行(四)

思考

接下来,我将用argparse命令行模拟一些git的常用指令。

首先常用的git指令有:

git status

git add xxxxxx

git commit

git push

这就需要用到gitpython库和argparse中的嵌套解析器等方法。

安装gitpython库

首先下载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 <msg> 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)

解析参数git,args

我们已经为每个子解析器建立了自己的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。

实现handle

其实很简单,就是将你原来如何使用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值