使用argparse创建相互包含的位置参数

时间:2013-04-10 19:49:20

标签: python argparse

我正在尝试使用Python的argparse模块构建命令行界面。我想要两个位置参数,其中一个取决于另一个(相互包容)。这就是我想要的:

prog [arg1 [arg2]]

这是我到目前为止所拥有的:

prog [arg1] [arg2]

由以下人员制作:

parser = argparse.ArgumentParser()
parser.add_argument('arg1', nargs='?')
parser.add_argument('arg2', nargs='?')

我如何从那里获得相互包容的arg2?

2 个答案:

答案 0 :(得分:0)

您可以使用sub_parsers执行类似的操作。

以下是文档和示例:

http://docs.python.org/2/library/argparse.html#sub-commands

答案 1 :(得分:0)

模块argparse没有创建相互包含参数的选项。 但是,自己编写很简单。
首先将两个参数都添加为可选参数:

parser.add_argument('arg1', nargs='?')
parser.add_argument('arg2', nargs='?')

在解析参数之后,检查是否设置了arg1,而没有设置arg2

args = parser.parse_args()
if args.arg1 and not args.arg2:

(如果将未使用的参数的默认值从None更改为其他值,这可能会更棘手)

然后使用parser.error()函数显示正常的argparse错误消息:

parser.error('the following arguments are required: arg2')

最后更改用法:消息以显示arg2取决于arg1

parser = argparse.ArgumentParser(usage='%(prog)s [arg1 [arg2]]')

完整的脚本:

import argparse

parser = argparse.ArgumentParser(usage='%(prog)s [arg1 [arg2]]')
parser.add_argument('arg1', nargs='?')
parser.add_argument('arg2', nargs='?')

args = parser.parse_args()

if args.arg1 and not args.arg2:
    parser.error('the following arguments are required: arg2')