简体   繁体   English

如何使用带有条件可选参数的python argparse?

[英]How to use python argparse with conditionally optional arguments?

Here is the current code. 这是当前代码。

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()

The script is called sacsproc, so I run it from the command line as follows: 该脚本称为sacsproc,因此我从命令行如下运行它:

./sacsproc Convert input.csv output.csv

This all works nicely, the problem is that I need more sacsproc commands which may have a totally different set of secondary parameters. 这一切都很好,问题是我需要更多的sacsproc命令,这些命令可能具有完全不同的辅助参数集。 ie one command might be: 即一个命令可能是:

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

Thus, I am trying to determine how one defines arguments that are conditional on the first argument ? 因此,我试图确定一个人如何定义以第一个参数为条件的参数 In my mind, I'm thinking about the zfs command line utilities that do what I am trying to do (eg zpool create mirror sdb sdc vs. zpool remove sda). 在我看来,我正在考虑可以执行我想做的事情的zfs命令行实用程序(例如zpool create mirror sdb sdc vs. zpool remove sda)。

use subparsers 使用次级解析器

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')

ok ... 好 ...

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"])

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM