【问题标题】:How to use python argparse with conditionally optional arguments?如何使用带有条件可选参数的python argparse?
【发布时间】:2017-06-06 18:07:33
【问题描述】:

这是当前代码。

import time
import collections
from modules import outputs
from modules import scrub
from modules import lookups

parser = argparse.ArgumentParser(description='AppMap Converter to Generate Asset Files from AppMapp Data')
parser.add_argument("operation", nargs='?', default="empty", help='The operation to perform')
parser.add_argument("input", nargs='?', default="empty", help='The input AppMapp File Path')
parser.add_argument("output", nargs='?', default="empty", help='The output Asset File Path')
args = parser.parse_args()

start = time.time()

if(args.operation == "Convert"):
    input_file_path = args.input
    output_file_path = args.output
    #DO LOTS OF STUFF
else:
    exit()

这个脚本叫做sacsproc,所以我从命令行运行它如下:

./sacsproc Convert input.csv output.csv

这一切都很好,问题是我需要更多的 sacsproc 命令,这些命令可能有一组完全不同的辅助参数。即一个命令可能是:

./sacsproc Clean -rts input.csv output.csv err.csv

因此,我试图确定如何定义以第一个参数为条件的参数?在我看来,我正在考虑执行我想做的事情的 zfs 命令行实用程序(例如 zpool create mirror sdb sdc vs. zpool remove sda)。

【问题讨论】:

    标签: python conditional argparse optional-parameters


    【解决方案1】:

    使用子解析器

    subparsers = parser.add_subparsers(help="sub-command help")
    
    group1 = subparsers.add_parser("something",help="do something")
    group1.set_defaults(which="g1") # some default value (so you know which group was activated)
    group1.add_argument("ARG",help='do something on ARG')
    
    group2 = subparsers.add_parser("other",help="do something else")
    group2.set_defaults(which="g2") # give some default value
    group2.add_argument("ARG",help='do something else on ARG')
    

    好的……

    import argparse
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers(help="sub-command help")
    g1 = subparsers.add_parser("thing1",help="bind to a port and just echo back anything it gets ... with a prompt")
    g1.set_defaults(which="g1")
    g1.add_argument("input",help='the input file')
    g1.add_argument("output",help='the output file')
    g2 = subparsers.add_parser("thing2",help="create a bridge between two ports, this is useful for generating a logfile")
    g2.set_defaults(which="g2")
    g2.add_argument("input",help='thie input file')
    g2.add_argument("output",help='the output file')
    g2.add_argument("error",help="the err file")
    
    
    def print_help(args):
        print "ARGS:",args
        try:
            parser.parse_args(args)
        except:
            print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n"
    
    print_help(["-h"])
    print_help(["thing1","-h"])
    print_help(["thing2","-h"])
    

    【讨论】:

    • 谢谢,为我指明了正确的方向。测试后我认为这可行,但帮助文件似乎有点不稳定: $ ./sacsproc CombineAppMapp --help usage: sacsproc ConvertAppMapp [-h] [input] [output]
    • 移动我得到的东西(不是我期望的):$ ./sacsproc CombineAppMapp --help 用法:sacsproc [operation] ConvertAppMapp [-h] [input] [output]
    • 我希望您可以自己连接这些点,但现在有一个更完整的示例,正​​是您想要的我认为...
    猜你喜欢
    • 1970-01-01
    • 2020-05-04
    • 2016-05-30
    • 2013-03-23
    • 2017-02-23
    • 2018-08-11
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    相关资源
    最近更新 更多