繁体   English   中英

使用ArgParse解析python的参数

[英]Argument parsing python using ArgParse

我正在创建一个python脚本,并且需要解析参数:脚本将接受三个参数,只有一个始终是强制性的,第二个将仅是强制性的,具体取决于第一个和第三个的某些值。没有出现。 这是我的尝试:

class pathAction(argparse.Action):
folder = {'remote':'/path1', 'projects':'/path2'}
def __call__(self, parser, args, values, option = None):
    args.path = values
    print "ferw %s " % args.component
    if args.component=='hos' or args.component=='hcr':
        print "rte %s" % args.path
        if args.path and pathAction.folder.get(args.path):
            args.path = pathAction.folder[args.path]
        else:
            parser.error("You must enter the folder you want to clean: available choices[remote, projects]")   

def main():
try:
    # Arguments parsing
    parser = argparse.ArgumentParser(description="""This script will clean the old component files.""")
    parser.add_argument("-c", "--component",  help="component to clean",  type=lowerit, choices=["hos", "hcr", "mdw", "gui"], required=True)
    parser.add_argument("-p", "--path",       help="path to clean", action = pathAction, choices = ["remote", "projects"])
    parser.add_argument("-d", "--delete",     help="parameter for deleting the files from the filesystem", nargs='*', default=True)


    args = parser.parse_args()  

如果除一种情况下工作正常:如果我有-c,则应该投诉,因为没有-p,但是没有,您能帮我吗? 谢谢

您可以添加一些自定义验证,如下所示:

if args.component and not args.path:
    parser.error('Your error message!')

仅当存在-p参数时,才会使用您的特殊action 如果只给它-c ,则从不使用交叉检查。

通常,检查parse_args之后的parse_args (如Gohn67建议的)比使用自定义操作更可靠,更简单。

如果您的命令行是'-p remote -c ...'会发生什么? 将在解析和设置-c值之前调用pathAction 那是你要的吗? 仅当给出-p且它是最后一个参数时,您的特殊操作才有效。


另一种选择是使“组件”成为子解析器的位置。 默认情况下,需要位置。 可以将pathdelete添加到需要它们的那些子解析器中。

import argparse
parser = argparse.ArgumentParser(description="""This script will clean the old component files.""")
p1 = argparse.ArgumentParser(add_help=False)
p1.add_argument("path", help="path to clean", choices = ["remote", "projects"])
p2 = argparse.ArgumentParser(add_help=False)
p2.add_argument("-d", "--delete", help="parameter for deleting the files from the filesystem", nargs='*', default=True)
sp = parser.add_subparsers(dest='component',description="component to clean")
sp.add_parser('hos', parents=[p1,p2])
sp.add_parser('hcr', parents=[p1,p2])
sp.add_parser('mdw', parents=[p2])
sp.add_parser('gui', parents=[p2])
print parser.parse_args()

样品使用:

1848:~/mypy$ python2.7 stack21625446.py hos remote -d 1 2 3
Namespace(component='hos', delete=['1', '2', '3'], path='remote')

我使用parents简化了向多个子解析器添加参数的过程。 我将path定位,因为这是必需的(对于2个子解析器)。 在这种情况下,-- --path只会使用户键入更多内容。 随着nargs='*'--delete有属于subparsers所以它可以发生最后一次。 如果nargs是固定的( None或number),则可能是parser的参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM