User:Timothee Flutre/Notebook/Postdoc/2012/05/16: Difference between revisions

From OpenWetWare
Jump to navigationJump to search
(Autocreate 2012/05/16 Entry for User:Timothee_Flutre/Notebook/Postdoc)
 
(→‎Entry title: first version)
Line 6: Line 6:
| colspan="2"|
| colspan="2"|
<!-- ##### DO NOT edit above this line unless you know what you are doing. ##### -->
<!-- ##### DO NOT edit above this line unless you know what you are doing. ##### -->
==Entry title==
==Typical template for Python script==
* Insert content here...
 
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 MyClass.man ./MyClass.py
    # groff -mandoc MyClass.man > MyClass.ps
   
    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 <http://gnu.org/licenses/gpl.html>\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):
            try:
                opts, args = getopt.getopt( sys.argv[1:], "hVv:",
                                            ["help", "version", "verbose="])
            except getopt.GetoptError, err:
                sys.stderr.write("%s\n" % str(err))
                self.help()
                sys.exit(2)
            for o, a in opts:
                if o in ("-h", "--help"):
                    self.help()
                    sys.exit(0)
                elif o in ("-V", "--version"):
                    self.version()
                    sys.exit(0)
                elif o in ("-v", "--verbose"):
                    self.verbose = int(a)
                else:
                    assert False, "unhandled option"
                   
                   
        def checkAttributes(self):
            pass
       
       
        def run(self):
            self.checkAttributes()
           
            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()
        i.setAttributesFromCmdLine()
        i.run()





Revision as of 09:01, 16 May 2012

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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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 MyClass.man ./MyClass.py
   # groff -mandoc MyClass.man > MyClass.ps
   
   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 <http://gnu.org/licenses/gpl.html>\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):
           try:
               opts, args = getopt.getopt( sys.argv[1:], "hVv:",
                                           ["help", "version", "verbose="])
           except getopt.GetoptError, err:
               sys.stderr.write("%s\n" % str(err))
               self.help()
               sys.exit(2)
           for o, a in opts:
               if o in ("-h", "--help"):
                   self.help()
                   sys.exit(0)
               elif o in ("-V", "--version"):
                   self.version()
                   sys.exit(0)
               elif o in ("-v", "--verbose"):
                   self.verbose = int(a)
               else:
                   assert False, "unhandled option"
                   
                   
       def checkAttributes(self):
           pass
       
       
       def run(self):
           self.checkAttributes()
           
           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()
       i.setAttributesFromCmdLine()
       i.run()