User:Timothee Flutre/Notebook/Postdoc/2012/05/16

From OpenWetWare
< User:Timothee Flutre‎ | Notebook‎ | Postdoc‎ | 2012‎ | 05
Revision as of 09:01, 16 May 2012 by Timothee Flutre (talk | contribs) (Entry title: first version)
Jump to: navigation, search
Owwnotebook icon.png Project name <html><img src="/images/9/94/Report.png" border="0" /></html> Main project page
<html><img src="/images/c/c3/Resultset_previous.png" border="0" /></html>Previous entry<html>      </html>Next entry<html><img src="/images/5/5c/Resultset_next.png" border="0" /></html>

Typical template for Python script

It is always rewarding on the long term to start any script with a minimum amount of generic code (verbose, command-line options, help message, license, etc). But it's a pain to write all this every time, right? So here is my typical template for any Python script:

   #!/usr/bin/env python
   # Author: Timothee Flutre
   # License: GPL-3
   # Aim: does this and that
   # help2man -o ./
   # groff -mandoc >
   import sys
   import os
   import getopt
   import time
   import datetime
   import math
   class MyClass(object):
       def __init__(self):
           self.verbose = 1
       def help(self):
           msg = "`%s' does this and that.\n" % os.path.basename(sys.argv[0])
           msg += "\n"
           msg += "Usage: %s [OPTIONS] ...\n" % os.path.basename(sys.argv[0])
           msg += "\n"
           msg += "Options:\n"
           msg += " -h, --help\tdisplay the help and exit\n"
           msg += " -V, --version\toutput version information and exit\n"
           msg += " -v, --verbose\tverbosity level (0/default=1/2/3)\n"
           msg += "\n"
           msg += "Examples:\n"
           print msg; sys.stdout.flush()
       def version(self):
           msg = "%s 0.1\n" % os.path.basename(sys.argv[0])
           msg += "\n"
           msg += "License GPLv3+: GNU GPL version 3 or later <>\n"
           msg += "This is free software; see the source for copying conditions.  There is NO\n"
           msg += "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
           print msg; sys.stdout.flush()
       def setAttributesFromCmdLine(self):
               opts, args = getopt.getopt( sys.argv[1:], "hVv:",
                                           ["help", "version", "verbose="])
           except getopt.GetoptError, err:
               sys.stderr.write("%s\n" % str(err))
           for o, a in opts:
               if o in ("-h", "--help"):
               elif o in ("-V", "--version"):
               elif o in ("-v", "--verbose"):
                   self.verbose = int(a)
                   assert False, "unhandled option"
       def checkAttributes(self):
       def run(self):
           if self.verbose > 0:
               msg = "START %s" % time.strftime("%Y-%m-%d %H:%M:%S")
               startTime = time.time()
               print msg; sys.stdout.flush()
           # ... specific code ...
           if self.verbose > 0:
               msg = "END %s" % time.strftime("%Y-%m-%d %H:%M:%S")
               endTime = time.time()
               runLength = datetime.timedelta(seconds=
                                              math.floor(endTime - startTime))
               msg += " (%s)" % str(runLength)
               print msg; sys.stdout.flush()
   if __name__ == "__main__":
       i = MyClass()