Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据初始参数的值向argparse添加参数_Python_Command Line Arguments_Argparse - Fatal编程技术网

Python 根据初始参数的值向argparse添加参数

Python 根据初始参数的值向argparse添加参数,python,command-line-arguments,argparse,Python,Command Line Arguments,Argparse,我知道以前也有人问过类似的问题,但我真的找不到一个确切的问题(此外,我不理解“nargs”或“subparse”的概念,以及它如何适用于我的案例) 我想要像这样的东西: parser = argparse.ArgumentParser() parser.add_argument('-mode', choices=['download', 'upload'], required=True) parser.add_argument('-d', required=True) args = parser

我知道以前也有人问过类似的问题,但我真的找不到一个确切的问题(此外,我不理解“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()
因此,只有当
-mode
下载
时,才需要
-f
参数,否则不应对其进行分析这是怎么回事

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.')
演示:


通常,您应该避免使
--选项成为必需的。在这种情况下,我建议如下:

  • 用子命令替换
    --mode
  • 用位置参数替换
    -d
  • 仅将
    -f
    替换为
    下载
    命令的第二个位置参数
  • 如果确实需要,可以保留
    -d
    -f
    ,而不是将它们作为位置参数

    您的电话如下所示:

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

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

    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\u defaults
    的调用用于在最终解析的参数中标记使用了哪个命令。

    argparse
    没有相互包含的参数,这就是您所说的。相反,您应该既不需要
    -d
    也不需要
    -f
    ,而是在用法消息中包含必须同时指定两者或两者都不指定的事实,然后检查以确保同时指定了
    -d
    -f
    ,如果两者都是。您可以使用,这样,
    download
    就变成了一个子命令,它有自己的一组(必需)标志。太好了,谢谢。我不确定这种情况是否只发生在我的python版本(3.5)中,但我需要检查
    cmd
    中的
    args
    ,以防用户调用脚本时没有
    cmd
    。如果调用脚本时没有位置参数,
    argparse
    本身将引发错误。否则,第一个参数将用于
    cmd
    ./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