Few years back I had read Guido's entry on writing a nice "main" for python. When optparse came out for python 2.3 I had revised it and have been using the exact same code for of main for a long long time now... I find myself copying/pasting the same shit all the time so I thought I'd put it here for copying/pasting. Maybe others would find it interesting?
The code is as follows. You'd need to modify _USAGE , _OPTIONS , run , and perhaps the exception handling when calling run. Other than that you should be able to use this as is.
How do you guys write your main?
###############################################################################
#
###############################################################################
import sys
import traceback
from optparse import OptionParser
###############################################################################
#
###############################################################################
_USAGE = """
%prog param1 param2 --option1=value
"""
_OPTIONS = (
(("--option1",),
{"action" : "store",
"type" : "string",
"dest" : "option1",
"help" : "this is an option",
"default": "default value"
}),
)
###############################################################################
#
###############################################################################
class Usage(Exception):
def __init__(self, msg):
self.msg = msg
###############################################################################
#
###############################################################################
def run(param1, param2, in_repos=None):
pass
###############################################################################
#
###############################################################################
def main(argv=None):
if argv is None:
argv = sys.argv
try:
parser = OptionParser(usage=_USAGE)
for (t, d) in _OPTIONS:
apply(parser.add_option, t, d)
try:
(opts, args) = parser.parse_args(argv[1:])
except SystemExit:
raise
# ---------------------------------------------------------------------
except:
traceback.print_exc()
raise Usage("Unhandled exception")
# ---------------------------------------------------------------------
else:
try:
return apply(run, args, opts.__dict__)
# -----------------------------------------------------------------
except SystemExit:
raise
# -----------------------------------------------------------------
except:
traceback.print_exc()
except Usage, e:
print >> sys.stderr, e.msg
return 2
###############################################################################
#
###############################################################################
if __name__ == "__main__":
sys.exit(main())
|