import

The real power of Python is in its library modules. They provide a large and consistent set of Application Programming Interfaces (APIs) to many system libraries (often in a way independent of the operating system).

For example, if you need to use a random number generator, you can do:

  1. >>> import random
  2. >>> print random.randint(0, 9)
  3. 5

This prints a random integer between 0 and 9 (including 9), 5 in the example. The function randint is defined in the module random. It is also possible to import an object from a module into the current namespace:

  1. >>> from random import randint
  2. >>> print randint(0, 9)

or import all objects from a module into the current namespace (discouraged):

  1. >>> from random import *
  2. >>> print randint(0, 9)

or import everything in a newly defined namespace:

  1. >>> import random as myrand
  2. >>> print myrand.randint(0, 9)

In the rest of this book, we will mainly use objects defined in modules os, sys, datetime, time and cPickle.

All of the web2py objects are accessible via a module called gluon, and that is the subject of later chapters. Internally, web2py uses many Python modules (for example thread), but you rarely need to access them directly.

In the following subsections we consider those modules that are most useful.

os

This module provides an interface to the operating system API. For example:

  1. >>> import os
  2. >>> os.chdir('..')
  3. >>> os.unlink('filename_to_be_deleted')

Some of the os functions, such as chdir, MUST NOT be used in web2py because they are not thread-safe.

os.path.join is very useful; it allows the concatenation of paths in an OS-independent way:

  1. >>> import os
  2. >>> a = os.path.join('path', 'sub_path')
  3. >>> print a
  4. path/sub_path

System environment variables can be accessed via:

  1. >>> print os.environ

which is a read-only dictionary.

sys

The sys module contains many variables and functions, but the one we use the most is sys.path. It contains a list of paths where Python searches for modules. When we try to import a module, Python looks for it in all the folders listed in sys.path. If you install additional modules in some location and want Python to find them, you need to append the path to that location to sys.path.

  1. >>> import sys
  2. >>> sys.path.append('path/to/my/modules')

When running web2py, Python stays resident in memory, and there is only one sys.path, while there are many threads servicing the HTTP requests. To avoid a memory leak, it is best to check if a path is already present before appending:

  1. >>> path = 'path/to/my/modules'
  2. >>> if not path in sys.path:
  3. ... sys.path.append(path)

datetime

The use of the datetime module is best illustrated by some examples:

  1. >>> import datetime
  2. >>> print datetime.datetime.today()
  3. 2008-07-04 14:03:90
  4. >>> print datetime.date.today()
  5. 2008-07-04

Occasionally you may need to time-stamp data based on the UTC time as opposed to local time. In this case you can use the following function:

  1. >>> import datetime
  2. >>> print datetime.datetime.utcnow()
  3. 2008-07-04 14:03:90

The datetime module contains various classes: date, datetime, time and timedelta. The difference between two date or two datetime or two time objects is a timedelta:

  1. >>> a = datetime.datetime(2008, 1, 1, 20, 30)
  2. >>> b = datetime.datetime(2008, 1, 2, 20, 30)
  3. >>> c = b - a
  4. >>> print c.days
  5. 1

In web2py, date and datetime are used to store the corresponding SQL types when passed to or returned from the database.

time

The time module differs from date and datetime because it represents time as seconds from the epoch (beginning of 1970).

  1. >>> import time
  2. >>> t = time.time()
  3. 1215138737.571

Refer to the Python documentation for conversion functions between time in seconds and time as a datetime.

cPickle

This is a very powerful module. It provides functions that can serialize almost any Python object, including self-referential objects. For example, let’s build a weird object:

  1. >>> class MyClass(object): pass
  2. >>> myinstance = MyClass()
  3. >>> myinstance.x = 'something'
  4. >>> a = [1 , 2, {'hello':'world'}, [3, 4, [myinstance]]]

and now:

  1. >>> import cPickle
  2. >>> b = cPickle.dumps(a)
  3. >>> c = cPickle.loads(b)

In this example, b is a string representation of a, and c is a copy of a generated by de-serializing b.

cPickle can also serialize to and de-serialize from a file:

  1. >>> cPickle.dump(a, open('myfile.pickle', 'wb'))
  2. >>> c = cPickle.load(open('myfile.pickle', 'rb'))