IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    使用docopt轻松实现python命令行参数处理

    master发表于 2016-02-25 22:48:33
    love 0

    前面认识的一个python库 docopt,可以使用__doc__来实现命令行参数的处理,使用起来非常简单;我也刚好有在命令行添加或删除testsuite/testcase的需求,所以写了一个demo文件。
    PS:我才发现docopt有2年没更新了,好吧,还是可以继续用它。
    直接上我的demo程序: https://github.com/smilejay/python/blob/master/py2016/try_docopt.py

    #!/usr/bin/env python
    """Just try docopt lib for python
    
    Usage:
      try_docopt.py (-h | --help)
      try_docopt.py [options]
    
    Examples:
      try_docopt.py -s +ts5,-ts2 -c +tc5,-tc3
    
    Options:
      -h, --help
      -s, --testsuite suites    #add/remove some testsuites
      -c, --testcase cases      #add/remove some testcases
    
    """
    
    from docopt import docopt
    
    testsuites = ['ts1', 'ts2', 'ts3', 'ts4']
    testcases = ['tc1', 'tc2', 'tc3', 'tc4']
    
    
    def add_remove(tlist, opt_list):
        '''
        add/remove item in tlist.
        opt_list is a list like ['+ts5', '-ts2'] or ['+tc5', '-tc3'].
        '''
        flag = 0
        for i in opt_list:
            i = i.strip()
            if i.startswith('+'):
                tlist.append(i[1:])
            elif i.startswith('-'):
                if i[1:] in tlist:
                    tlist.remove(i[1:])
                else:
                    print 'bad argument: %s is not in %s' % (i[1:], tlist)
                    flag = 1
            else:
                print 'bad argument: %s' % i
                flag = 1
        if flag:
            return flag
        else:
            return tlist
    
    if __name__ == '__main__':
        args = docopt(__doc__)
        ts_arg = args.get('--testsuite')
        tc_arg = args.get('--testcase')
        if ts_arg:
            ts_opt_list = ts_arg.strip().split(',')
            testsuites = add_remove(testsuites, ts_opt_list)
        if tc_arg:
            tc_opt_list = tc_arg.strip().split(',')
            testcases = add_remove(testcases, tc_opt_list)
        if testsuites != 1 and testcases != 1:
            print 'ts: %s' % testsuites
            print 'tc: %s' % testcases

    执行效果:

    Jay-Ali:py2016 jay$ python try_docopt.py -s +ts5,+ts8,-ts1 --testcase -tc3,+tc6
    ts: ['ts2', 'ts3', 'ts4', 'ts5', 'ts8']
    tc: ['tc1', 'tc2', 'tc4', 'tc6']
    Jay-Ali:py2016 jay$
    Jay-Ali:py2016 jay$ python try_docopt.py -s +ts5,+ts8,-ts1 --testcase -tc3,+tc6,-tc7
    bad argument: tc7 is not in ['tc1', 'tc2', 'tc4', 'tc6']

    docopt的github地址:https://github.com/docopt/docopt
    更多的example:https://github.com/docopt/docopt/tree/master/examples

    Original article: 使用docopt轻松实现python命令行参数处理

    ©2016 笑遍世界. All Rights Reserved.



沪ICP备19023445号-2号
友情链接