【问题标题】:Add arguments to argparse depending on value of initial arguments根据初始参数的值向 argparse 添加参数
【发布时间】:2013-09-13 12:46:11
【问题描述】:

我知道以前有人问过类似的问题,但我真的找不到确切的问题(另外,我无法理解“nargs”或“subparse”的概念以及它如何适用于我的案例)

我想要类似的东西:

parser = argparse.ArgumentParser()
parser.add_argument('-mode', choices=['download', 'upload'], required=True)
parser.add_argument('-d', required=True)
args = parser.parse_args()
if args.mode == 'download':
    parser.add_argument('-f', required=True)

args = parser.parse_args()

所以只有当-modedownload 时才需要-f 参数,否则它不应该被解析

【问题讨论】:

  • argparse 没有相互包容的论点,这就是您所说的。相反,您应该既不需要 -d 也不需要 -f,而是在使用消息中包含必须指定两者或都不指定的事实,然后检查以确保同时指定 -d-f(如果有)是。
  • 你可以使用subparsers,这样download就变成了一个带有它自己的一组(必需的)标志的子命令。

标签: python command-line-arguments argparse


【解决方案1】:

这个怎么样?

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-mode', choices=['download', 'upload'], required=True)
parser.add_argument('-d', required=True)
parser.add_argument('-f')

args = parser.parse_args()
if args.mode == 'download' and not args.f:
    parser.error('-f argument is required in "download" mode.')

演示:

$ python test.py -mode=upload -d 10
$ python test.py -mode=download -d 10
usage: test.py [-h] -mode {download,upload} -d D [-f F]
test.py: error: -f argument is required in "download" mode.
$ python test.py -mode=download -d 10 -f 10

【讨论】:

    【解决方案2】:

    通常,您应该避免将--options 设为必需。在这种情况下,我建议如下:

    1. --mode 替换为子命令。
    2. -d 替换为位置参数
    3. 仅将 -f 替换为 download 命令的第二个位置参数。

    如果你真的想要,你可以保留 -d-f 而不是让它们成为位置参数。

    您的电话将如下所示:

    ./script.py upload d-argument
    ./script.py download d-argument f-argument
    

    ./script.py upload -d foo
    ./script.py download -d foo -f bar
    

    要实现的代码有点乏味,但相当简单。

    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()
    upload_parser = subparsers.add_parser('upload')
    download_parser = subparsers.add_parser('download')
    upload_parser.set_defaults(cmd='upload')
    download_parser.set_defaults(cmd='download')
    for p in [ upload_parser, download_parser ]:
        p.add_argument("d")
        # p.add_argument("-d", required=True)
    download_parser.add_argument("f")
    # download_parser.add_argument("-f", required=True)
    
    
    args = parser.parse_args()
    if args.cmd == 'upload':
        # handle upload with args.d
    elif args.cmd == 'download':
        # handle download with args.d and args.f
    

    注意对set_defaults 的调用用于在最终解析的参数中标记使用了哪个命令。

    【讨论】:

    • 太好了,谢谢。不确定这是否只发生在我的python版本(3.5),但我需要检查args中的cmd,以防用户在没有cmd的情况下调用脚本。
    • 如果您的脚本在没有位置参数的情况下被调用,argparse 本身将引发错误。否则,第一个参数将用于cmd
    猜你喜欢
    • 2015-07-24
    • 1970-01-01
    • 2014-09-02
    • 2020-03-23
    • 2022-11-29
    • 2014-07-01
    • 2011-11-21
    • 2016-07-12
    • 1970-01-01
    相关资源
    最近更新 更多