2011-02-11 37 views
2

在我的脚本中我尝试包装bazaar可执行文件。当我阅读某些为bzr而设计的选项时,我的脚本会对此作出反应。在任何情况下,所有的参数都会被赋予bzr可执行文件。当然,我不想指定bzr可以在 我的脚本中处理的所有参数。Python argpase:处理未知数量的参数/选项/ etc

那么,有没有办法用argpase处理未知数量的参数?

我的代码目前看起来是这样的:

parser = argparse.ArgumentParser(help='vcs') 
subparsers = parser.add_subparsers(help='commands') 

vcs = subparsers.add_parser('vcs', help='control the vcs', 
    epilog='all other arguments are directly passed to bzr') 

vcs_main = vcs.add_subparsers(help='vcs commands') 
vcs_commit = vcs_main.add_parser('commit', help="""Commit changes into a 
    new revision""") 

vcs_commit.add_argument('bzr_cmd', action='store', nargs='+', 
    help='arugments meant for bzr') 

vcs_checkout = vcs_main.add_parser('checkout', 
    help="""Create a new checkout of an existing branch""") 

的NARGS选项让尽可能多的论据,我当然要。但不是另一个未知的可选参数(如--fixes或--unchanged)。

+0

这似乎也有关: http://stackoverflow.com/questions/6488752/dont-parse-options-after-the-last-positional-argument – 2013-03-02 18:28:46

回答

3

这个问题的简单答案是使用argparse.ArgumentParser.parse_known_args方法。这将解析你的包装脚本知道并忽略其他人的论点。

下面是我根据您提供的代码键入的内容。

# -*- coding: utf-8 -*- 
import argparse 

def main(): 
    parser = argparse.ArgumentParser() 
    subparsers = parser.add_subparsers(dest='command', help='commands') 

    vcs = subparsers.add_parser('vcs', help='control the vcs') 
    vcs_main = vcs.add_subparsers(dest='vcs_command', help='vcs commands') 
    vcs_commit = vcs_main.add_parser('commit', 
            help="Commit changes into a new revision") 
    vcs_checkout = vcs_main.add_parser('checkout', 
             help="Create a new checkout of an " 
              "existing branch") 
    args, other_args = parser.parse_known_args() 

    if args.command == 'vcs': 
     if args.vcs_command == 'commit': 
      print("call the wrapped command here...") 
      print(" bzr commit %s" % ' '.join(other_args)) 
     elif args.vcs_command == 'checkout': 
      print("call the wrapped command here...") 
      print(" bzr checkout %s" % ' '.join(other_args)) 

    return 0 

if __name__ == '__main__': 
    main()