Python and PyQt on the Sharp Zaurus A300

The A300 doesn't have much internal RAM, so the best bet for running Python on it is the Python Zaurus Image which puts most of python in a cramfs image which is stored on the SD card and mounted in the right place via loopback.

One minor wrinkle is that the PyQt included doesn't work on the A300 -- if you try to import qt you get an error:

ImportError: /home/QtPalmtop/lib/libqte.so.2: undefined symbol: __8QLibraryRC7QStringQ28QLibrary6Policy

This is apparently because the Qt shipped with the A300 is weird in that this symbol is in libqpe.so.1 rather than libqte.so.2. Full details are available (if you can read Japanese!), but to cut a long story short the simplest of the three approaches he suggests is just to edit the .so files in the Python distribution to refer to libqpe.so.1 instead of libqte.so.2. (libqpe depends on libqte so doing this provides a strict superset of the required symbols so it all works out OK.)

Here's a script which does this automatically to create a python24.img.fixed from the python24.img file. You'll need mkcramfs and cramfsck.

#!/bin/sh -e
# Given a cramfs python24.img, unpack it, fix the .so files
# which refer to libqte.so.2 to refer to libqpe.so.1, and repack.
# This is a workaround for a bug/incompatibility in the Qt
# shipped in the Zaurus A300 ROM.

if [ $# -ne 1 ]; then
   echo "Usage: fix-zaurus-python-image python.img"
   exit 1
fi

if [ $(id -u) -ne 0 ]; then
   echo "Sorry, you must be root to get permissions right"
   exit 1
fi

IMG="$1"
DIR="/tmp/zimg"

if [ -e "$DIR" ]; then
   echo "$DIR seems to already exist, aborting"
   exit 1
fi

# Make sure sed isn't playing silly games with non-ASCII charsets
export LANG=C
export LC_CTYPE=C

echo "Unpacking $IMG in $DIR..."
mkdir "$DIR"
cramfsck -x "$DIR/ext" "$IMG"
for LIB in "$DIR"/ext/site-packages/*.so; do
   echo "Patching $LIB..."
   sed -e 's/libqte.so.2/libqpe.so.1/' < "$LIB" > "$LIB.new"
   mv "$LIB.new" "$LIB"
done
echo "Building new image file..."
mkcramfs "$DIR/ext" "$IMG.fixed"
echo "Cleaning up..."
rm -rf "$DIR"
echo "Done, new file is $IMG.fixed"

This page written by Peter Maydell (pmaydell@chiark.greenend.org.uk).