Python Google Chart 0.2.0

I released pygooglechart 0.2.0 this afternoon after several months of patches coming in to add features and fix bugs. The main addition to pygooglechart is automatic data scaling, which is turned on by default. You can also specify the scale range manually:

chart = SimpleLineChart(width, height, x_range=(0, 100), y_range=(0, 100))

Other features are the new API chart types and options. There are 3 new chart types: Map, Google-o-Meter and Radar. Here is an example of using the Map chart type:

import pygooglechart as gc

chart = gc.MapChart(440, 220)
chart.set_colours(('AAAAAA', '30A030', 'A0C030'))
chart.set_codes(['AU', 'US', 'CA', 'BR', 'NZ'])
chart.add_data([1, 0.5, 0.7, 0.3, 0.1])'map.png')

Produces the URL:×220&chd=s:9frSG&chco=AAAAAA,30A030,A0C030&chtm=world&chld=AUUSCABRNZ

And the image:

The Google-o-meter has a funny name. Here is an example of its usage:

import pygooglechart as gc

chart = gc.GoogleOMeterChart(440, 220, y_range=(0, 10))

It produces this URL:×220&chd=s:x&chl=Awesome

And the image:

Well, have fun. Please tweet me for any bugs, patches or feature requests you have.


I find readability very important when reading data. It saves time and energy. To me, Python’s pprint module is not easy to read in a lot of cases so I made my own. This is how pprint looks like at the moment:

BetterPrint is based on a lot of the source code, which looks about 10 years old. It makes more sense to me to have braces aligned by column rather than jammed together inline. BetterPrint also introduces colour to increase readability even more. As you can see from the following screen shot:

BetterPrint is compatible with Python’s pprint module, so you can simply “import betterprint” aliased as pprint like so:

    import betterprint as pprint
except ImportError:
    import pprint

If you have setuptools installed simply run “easy_install betterprint”, or visit the web page for more details and installation instructions.

Python Call Graph 0.4.0

I’ve just released pycallgraph 0.4.0. It has several major new features including a command line interface and measuring accumulative time per function.

The 0.4.0 pycallgraph CLI supports function filtering, timing filtering, maximum stack level and a few more settings. For example, to do a simple call graph on “”: mygraph.png

Here’s an example that doesn’t include the class Foo and outputs to a SVG file format: –exclude=”*.Foo.*” –image-format=svg myfile.svg

Turns out far easier than modifying your source code to create a call graph.

Here’s one of the graphs from the source code examples

Orange Green Example

As you can see it has green and orange gradients. One end of the gradient is green because of the number of calls is high and the other is orange because the function calls are taking the longest. All that with a function that looks like this:

def orange_green(calls, total_time):
    """Make a higher total time have an orange colour and a higher number
    of calls have a green colour using RGB.
    return '#%02X%02X%02X' % (
        0x30 + total_time * 0xc0,
        0x30 + calls * 0xc0 + total_time * 0x70,

I hope it’s useful to you!

Django time zone problem

This is a Django bug specific to Windows and it took me half a day to figure out because I trusted the datetime module! Basically if you set your TIME_ZONE in the file like so:

TIME_ZONE = 'Australia/Sydney'

The datetime and time modules will always return the UTC date.

The strange thing is that if you use “python shell” you get the bug but if you just use “python” you don’t get the bug.

Correct time:

Python 2.4.3 (#69, Mar 29 2006, 17:35:34) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
datetime.datetime(2006, 9, 28, 12, 11, 38, 109000)

Django time:

c:\project>python shell --plain
Python 2.4.3 (#69, Mar 29 2006, 17:35:34) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
datetime.datetime(2006, 9, 28, 3, 12, 16, 468000)

Possible solutions:

Creating a Django cron job

I couldn’t find a way to directly call a Python function in a Django application view from the command line. It doesn’t seem like it is a common thing to do from my Google search attempts. In this example I have a function defined to download a few web sites once a day using a custom made Django model. The project is called mytestproject and the application is called mytestapp. Here is the file:

import urllib2
from models import WebSite
def daily_job():
    for site in WebSite.objects.all():
        page_html = urllib2.urlopen(site.url).read()

To run this function from the command line an optimist would create a python script that looks like this:

#!/usr/bin/env python
from mytestapp.views import daily_job

Running this will give you an exception about your DJANGO_SETTINGS_MODULE environment variable not being defined:

EnvironmentError: Environment variable DJANGO_SETTINGS_MODULE is undefined.

Lets change the script a little to conform with Django’s demands.

#!/usr/bin/env python
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from mytestapp.views import daily_job

Please note that according to the documentation, DJANGO_SETTINGS_MODULE should be ‘mytestproject.settings’ instead of just ‘settings’. Using the project name in DJANGO_SETTINGS_MODULE will cause troubles in our situation because Django does some tricky things to your path before importing the settings module. For our needs it isn’t necessary to do this.

Of course you can make this script a little more generic so you can run an arbitrary script from your cron job if you feel the need to:

import sys
import os

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

module_name = sys.argv[1]
function_name = ' '.join(sys.argv[2:])

exec('import %s' % module_name)
exec('%s.%s' % (module_name, function_name))

I’ll call this script To run my daily_job function:

python mytestapp.views daily_job()

And your modnight cron job entry should look something like:

0 0 * * * python /path/to/mytestproject/ mytestapp.views daily_job()

And there you have it. I hope this will save you some time!