def docopt_wrapper(usage, real_usage, **keywords):
""" A wrapper around the real docopt parser.
Redirects a failed command to /dev/null and prints the proper
real_usage message, instead of just the usage string from usage.
:param usage: The simplified usage string to parse
:type usage: str
:param real_usage: The original usage string to parse
:type real_usage: str
:param keywords: The keyword arguments to pass to docopt
:type keywords: dict
:returns: The parsed arguments
:rtype: dict
"""
base_subcommand = keywords.pop('base_subcommand')
subcommand = keywords.pop('subcommand')
try:
stdout = sys.stdout
# We run docopt twice (once with the real usage string and
# once with the modified usage string) in order to populate
# the 'real' arguments properly.
with open(os.devnull, 'w') as nullfile:
sys.stdout = nullfile
real_arguments = docopt.docopt(
real_usage,
argv=[base_subcommand])
arguments = docopt.docopt(
usage,
**keywords)
sys.stdout = stdout
real_arguments.update(arguments)
real_arguments[subcommand] = True
return real_arguments
except docopt.DocoptExit:
sys.stdout = stdout
print(real_usage.strip(), file=sys.stderr)
sys.exit(1)
except SystemExit:
sys.stdout = stdout
if "argv" in keywords and any(h in ("-h", "--help")
for h in keywords["argv"]):
print(real_usage.strip())
elif "version" in keywords and any(v in ("--version")
for v in keywords["argv"]):
print(keywords["version"].strip())
sys.exit()
评论列表
文章目录