【问题标题】:Creating mutually inclusive positional arguments with argparse使用 argparse 创建相互包含的位置参数
【发布时间】:2013-04-02 20:09:37
【问题描述】:

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

prog [arg1 [arg2]]

这是我目前所拥有的:

prog [arg1] [arg2]

制作者:

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

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

【问题讨论】:

标签: python argparse


【解决方案1】:

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

以下是文档和示例:

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

【讨论】:

  • 不幸的是,这不起作用,因为 arg1 需要是动态的。子命令是固定字符串。例如, prog multiarg arg1 arg2,其中 multiarg 是固定的命令字符串。此外,即使添加了子命令,您最终也会遇到相同的情况。
【解决方案2】:

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

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

解析参数后检查是否设置了arg1arg2 未设置:

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

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

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

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

最后更改 usage: 消息以显示 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')

【讨论】:

    猜你喜欢
    • 2013-03-29
    • 2016-05-04
    • 2011-05-27
    • 1970-01-01
    • 2020-07-29
    • 2018-07-25
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多