【问题标题】:Argument Groups help output参数组帮助输出
【发布时间】:2017-08-06 02:43:36
【问题描述】:

我正在尝试使用 Argparse 模块找出解决方案。帮助输出和我的代码如下。该代码似乎工作。

但是,帮助输出不是最佳的。我想通过“Usage:”进行交流,“-E”至少需要-s DATE,并且-s 和-e 都是只有在与-E 一起使用时才有意义的参数。 (我知道我可以在帮助消息的文本中做到这一点,但我正在寻找对用户更明显的东西。)我尝试了 subparser,这似乎让事情变得更清晰了。但是,我想不出一种方法让 subparser 在没有开关的情况下接受参数。例如,我的子解析器版本强迫我输入“SO_Test.py file -f somefile.txt”,而不是下面允许“SO_Test.py -f somefile.txt”的代码。对于格式更好的帮助,我有哪些选择?

问候, 布尔津

usage: SO_Test.py [-h] [-i | -f FILE | -E ENDPOINT] [-a] [-x] [-s DATE]
                  [-e DATE]

This is my test ArgParse script.

optional arguments:
  -h, --help   show this help message and exit
  -i           Run the script interactively. This is the default mode if n
               options are specfied.
  -f FILE      Run the script against an input file.
  -E ENDPOINT  Run the script against a specific endpoint.
  -a           Audit only.
  -x           Switches queries to use staging.
  -s DATE      Specify a start date. This is mandatory with the -E switch.
  -e DATE      Specify an end date. This optional with the -E switch.

import argparse
from time import time as timer
import sys
def valid_date(iso8601):
    pass
def valid_file(parser, fname):
    pass
    return fname
def file_mode(fname, audit, staging):
    print("Start in file mode.  Audit is {} and staging is {}.".format(audit, staging))
    sys.exit(0)
def endpoint_mode(endpoint, start_time, end_time, audit, staging):
    print("Start in endpoint mode.  Audit is {} and staging is {}.".format(audit, staging))
    sys.exit(0)
def interactive_mode(audit, staging):
    print("Start in interactive mode.  Audit is {} and staging is {}.".format(audit, staging))
def main():
    parser = argparse.ArgumentParser(description="This is my test ArgParse script.")
    group = parser.add_mutually_exclusive_group()
    group.add_argument("-i", \
                        dest="interactive", \
                        action="store_true", \
                        help="Run the script interactively.  This is the default " + \
                             "mode if no options are specfied.")
    group.add_argument("-f", \
                        dest="fname", \
                        help="Run the script against an input file.", \
                        metavar="FILE", \
                        type=lambda x: valid_file(parser, x))
    group.add_argument("-E", \
                        dest="endpoint",
                        help="Run the script against a specific endpoint.",
                        metavar="ENDPOINT")
    parser.add_argument("-a", \
                        dest="audit", \
                        action="store_true", \
                        help="Audit only.")
    parser.add_argument("-x", \
                        dest="staging", \
                        action="store_true", \
                        help="Switches queries to use staging.")
    parser.add_argument("-s", \
                        dest="start_time", \
                        help="Specify a start date.  This is mandatory with the -E switch.", \
                        metavar="DATE",
                        type=valid_date)
    parser.add_argument("-e", \
                        dest="end_time", \
                        help="Specify an end date.  This optional with the -E switch.", \
                        metavar="DATE")
    args = parser.parse_args()
    audit = args.audit
    staging = args.staging
    interactive = args.interactive
    fname = args.fname
    endpoint = args.endpoint
    start_time = args.start_time
    end_time = args.end_time
    if not len(sys.argv) > 1:
        interactive_mode(audit, staging)
    if args.interactive is True:
        interactive_mode(audit, staging)
    if '-f' in sys.argv:
        file_mode(fname, audit, staging)
    if '-E' in sys.argv:
        endpoint_mode(endpoint, start_time, end_time, audit, staging)

if __name__ == "__main__":
    main()

【问题讨论】:

  • argparse 没有实现那种“相互包含”分组。在解析之后进行这种测试是最简单的(我会使用endpoint is not None 而不是'-E' in sys.argv)。并编写您自己的usage。问题 - 在您的情况下,什么是有意义的 usage?我不太了解您的要求,无法推测。

标签: python python-2.7 argparse


【解决方案1】:

使用子解析器,您的 file 大小写会发生变化

"SO_Test.py -f somefile.txt".

"SO_Test.py file somefile.txt".

file 子解析器采用一个位置参数。

类似地,endpoint 子解析器可以定义为需要 endpoint 位置、sdate 位置(或必需的可选)和标记的 edate


我认为您不需要直接查看sys.argvargs 中有足够的信息。没有给出的参数有默认值,通常是None

args = parser.parse_args()
audit = args.audit     # True/False
staging = args.staging     # True/False
interactive = args.interactive    # True/False
fname = args.fname
endpoint = args.endpoint
start_time = args.start_time
end_time = args.end_time

# so if there's any commands do this?
if not len(sys.argv) > 1:
    interactive_mode(audit, staging)

# if args.interactive:
if args.interactive is True:
    interactive_mode(audit, staging)

# if fname is not None:
if '-f' in sys.argv:
    file_mode(fname, audit, staging)

# if endpoint is None:
if '-E' in sys.argv:
    endpoint_mode(endpoint, start_time, end_time, audit, staging)

【讨论】:

  • 我还在为此苦苦挣扎。您能否指出文件子解析器采用一个位置参数的示例。您能否还指出我如何为不带争论的 suparser 设置默认操作。最后,我正在尝试做这样的事情 "endpoint_parser.add_argument("-s", dest="start_time", action="store_true", help="The start time", metavar="DATE", type=valid_date )' 但是,使用 metavar 和 type 会抛出错误
  • store_true 不接受任何参数。如果存在destTrue,则默认为Falsemetavartype 没有价值或用途,如果给定可能会产生错误(arg_arguments 中的参数检查不严格)。
  • sp = parser.add_subparsers(dest='cmd') 会将子解析器的名称放在args.cmd 中。这样您就可以确定使用了哪个“命令”。
猜你喜欢
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
相关资源
最近更新 更多