我想完成这样的事情:
-LoadFiles
-SourceFile "" -DestPath ""
-SourceFolder "" -DestPath ""
-GenericOperation
-SpecificOperation -Arga "" -Argb ""
-OtherOperation -Argc "" -Argb "" -Argc ""
用户应该可以运行以下内容:
-LoadFiles -SourceFile“somePath”-DestPath“somePath”
或
-LoadFiles -SourceFolder“somePath”-DestPath“somePath”
基本上,如果你有-LoadFiles,那么你需要有-SourceFile或-SourceFolder。如果你有-SourceFile,则需要-DestPath等。
其他参数的必需参数链是否可能?如果没有,我至少可以做一些事情,如果你有-SourceFile,你必须有-DestPath?
答案 0 :(得分:12)
在您创建的parse_args
个实例上致电ArgumentParser
后,它会给您一个Namespace
个对象。只需检查一个参数是否存在,那么另一个参数也必须存在。像:
args = parser.parse_args()
if ('LoadFiles' in vars(args) and
'SourceFolder' not in vars(args) and
'SourceFile' not in vars(args)):
parser.error('The -LoadFiles argument requires the -SourceFolder or -SourceFile')
答案 1 :(得分:2)
您可以在argparse中使用子解析器
import argparse
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('--foo', required=True, help='foo help')
subparsers = parser.add_subparsers(help='sub-command help')
# create the parser for the "bar" command
parser_a = subparsers.add_parser('bar', help='a help')
parser_a.add_argument('bar', type=int, help='bar help')
print(parser.parse_args())
答案 2 :(得分:1)
以下是一个示例,如果您指定了--makeDependency,则强制您使用值指定--dependency。
这不是由argparse单独完成的,而是由稍后验证用户指定内容的程序完成的。
#!/usr/bin/env python
import argparse
import sys
parser = argparse.ArgumentParser()
parser.add_argument('--makeDependency', help='create dependency on --dependency', action='store_true')
parser.add_argument('--dependency', help='dependency example')
args = parser.parse_args()
if args.makeDependency and not args.dependency:
print "error on dependency"
sys.exit(1)
print "ok!"
答案 3 :(得分:1)
有一些argparse
替代方案,您可以轻松地管理提到的案例。
像这样的包:
click或
docopt。
如果我们想绕过argparse中链参数的手动实现,请查看一下Commands and Groups,例如click。