ActiveState Code

Recipe 528877: Skeleton script Hello World


I write a lot of small scripts in Python. This is the template that I use to start most of my scripts. This gets me started with good documentation, argument parsing, and error handling.

Python
 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
#!/usr/bin/env python
"""
SYNOPSIS

    TODO helloworld [-h,--help] [-v,--verbose] [--version]

DESCRIPTION

    TODO This describes how to use this script. This docstring
    will be printed by the script if there is an error or
    if the user requests help (-h or --help).

EXAMPLES

    TODO: Show some examples of how to use this script.

EXIT STATUS

    TODO: List exit codes

AUTHOR

    TODO: Name <name@example.org>

LICENSE

    This script is in the public domain, free from copyrights or restrictions.

VERSION

    $Id$
"""

import sys, os, traceback, optparse
import time
import re
#from pexpect import run, spawn

def main ():

    global options, args
    # TODO: Do something more interesting here...
    print 'Hello world!'

if __name__ == '__main__':
    try:
        start_time = time.time()
        parser = optparse.OptionParser(formatter=optparse.TitledHelpFormatter(), usage=globals()['__doc__'], version='$Id$')
        parser.add_option ('-v', '--verbose', action='store_true', default=False, help='verbose output')
        (options, args) = parser.parse_args()
        #if len(args) < 1:
        #    parser.error ('missing argument')
        if options.verbose: print time.asctime()
        main()
        if options.verbose: print time.asctime()
        if options.verbose: print 'TOTAL TIME IN MINUTES:',
        if options.verbose: print (time.time() - start_time) / 60.0
        sys.exit(0)
    except KeyboardInterrupt, e: # Ctrl-C
        raise e
    except SystemExit, e: # sys.exit()
        raise e
    except Exception, e:
        print 'ERROR, UNEXPECTED EXCEPTION'
        print str(e)
        traceback.print_exc()
        os._exit(1)

Discussion

Everybody has their own version of this script, but if you don't have one then I think this is good starter for command-line scripts. Obviously no single template can be used to start every script.

There are TODO markers in the script so you will know what parts to fill in with your code. Most programming editors will highlight TODO tags.

Everything that you put into the docstring becomes the script's help page, so when you run the script with the '--help' option it will print the docstring and then exit. The docstring is patterned after a UNIX man page.

Argument and option parsing is done with optparse.

The entire main() function is wrapped in a try/except to handle any unexpected exceptions. The SystemExit handler is there to cleanly quit the script if sys.exit() is called anywhere in the script.

I use this with a Vim template system, so whenever I start a new Python script Vim will copy this template into the new buffer. I don't use any elaborate substitution template. TODO tags are good enough for me.

Comments

  1. 1. At 3:48 p.m. on 21 aug 2007, Steven Bethard said:

    optparse. You should really look at optparse in the stdlib. Seems like you're doing a lot more work than you have to here.

  2. 2. At 4:49 a.m. on 2 oct 2007, Ulf Rompe said:

    Superfluous line. The first "if VERBOSE: print time.asctime()" will never print anything because VERBOSE is False by default and may be set to True in main() which is called in the next line.

  3. 3. At 4:52 a.m. on 2 oct 2007, Ulf Rompe said:

    Wrong comment thread. Sorry, this comment should have gone to the top level.

  4. 4. At 1:53 a.m. on 15 nov 2007, Simon Tite said:

    good starting template. As a complete and utter newbie to Python, this for me is a good starting point for starting a new script. I just hate starting from a completely blank piece of paper, don't you?

  5. 5. At 2:54 p.m. on 4 dec 2007, Noah Spurrier (the author) said:

    Now uses optparse. I switched it to optparse.

  6. 6. At 2:55 p.m. on 4 dec 2007, Noah Spurrier (the author) said:

    FIXED. Yep, I was doing the entire option parsing in the wrong function anyways. This is fixed.

Sign in to comment