1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
#!/usr/bin/env python3
"""
This example uses docopt with the built in cmd module to demonstrate an
interactive command application.
Usage:
my_program tcp <host> <port> [--timeout=<seconds>]
my_program serial <port> [--baud=<n>] [--timeout=<seconds>]
my_program (-i | --interactive)
my_program (-h | --help | --version)
Options:
-i, --interactive Interactive Mode
-h, --help Show this screen and exit.
--baud=<n> Baudrate [default: 9600]
"""
import cmd
import sys
from docopt import DocoptExit
from docopt import docopt
def docopt_cmd(func):
"""
This decorator is used to simplify the try/except block and pass the result
of the docopt parsing to the called action.
"""
def fn(self, arg):
try:
opt = docopt(fn.__doc__, arg)
except DocoptExit as e:
# The DocoptExit is thrown when the args do not match.
# We print a message to the user and the usage block.
print("Invalid Command!")
print(e)
return
except SystemExit:
# The SystemExit exception prints the usage for --help
# We do not need to do the print here.
return
return func(self, opt)
fn.__name__ = func.__name__
fn.__doc__ = func.__doc__
fn.__dict__.update(func.__dict__)
return fn
class MyInteractive(cmd.Cmd):
intro = "Welcome to my interactive program! (type help for a list of commands.)"
prompt = "(my_program) "
file = None
@docopt_cmd
def do_tcp(self, arg):
"""Usage: tcp <host> <port> [--timeout=<seconds>]"""
print(arg)
@docopt_cmd
def do_serial(self, arg):
"""Usage: serial <port> [--baud=<n>] [--timeout=<seconds>]
Options:
--baud=<n> Baudrate [default: 9600]
"""
print(arg)
def do_quit(self, arg):
"""Quits out of Interactive Mode."""
print("Good Bye!")
exit()
opt = docopt(__doc__, sys.argv[1:])
if opt["--interactive"]:
MyInteractive().cmdloop()
print(opt)
|