依赖于Argparse的其他参数的参数

时间:2014-12-10 21:35:55

标签: python argparse

我想完成这样的事情:

-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?

4 个答案:

答案 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替代方案,您可以轻松地管理提到的案例。 像这样的包: clickdocopt

如果我们想绕过argparse中链参数的手动实现,请查看一下Commands and Groups,例如click。