【发布时间】: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