[英]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
且它是最后一个参数时,您的特殊操作才有效。
另一种选择是使“组件”成为子解析器的位置。 默认情况下,需要位置。 可以将path
和delete
添加到需要它们的那些子解析器中。
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.