In response to a question in another thread, here is a summary of how
I got web2py running on my Android device (a Samsung Note), using
hints found here and there.

Maybe it can save some time for those wanting to do the same thing.

Note : I am just getting started with Android, so there are probably
better and/or easier ways to do it than what I describe here.

Please add to this thread if you see anything missing or incorrect.

---------------------------------

First we need to get python running on the device, obviously.

This is done by installing SL4A (scripting layer for Android).
Get the the apk from http://code.google.com/p/android-scripting/ and
install it
(requires checking "unknown sources" in settings/applications)
SL4A was initially called ASE (Android scripting engine), so many
older Howtos use that instead.

Run the app, use menu/view/interpreters : by default there is only
"shell".
Use menu again, "add", choose Python.
This downloads the installer. Run "python for android" from your apps
list, install...

Whew, now we have Python on our device, but it only runs through the
SL4A interface.


Now we need to get it running from the command line.

I used the traditional "adb" method to connect from the PC to the
Android console, with the USB cable.
adb can be found in the Android SDK, and is also included in several
rooting kits, which are smaller (adb is just one executable and two
DLLs under Windows).
It also needs the USB drivers for the device, which means installing
vendor software (like Kies for Samsung).

(Users who already have an SSH daemon running on their device can use
ssh and scp and Wifi instead)

So, if all goes well, "adb shell" will connect you to a very basic
Linux console on your device.

On mine, the SL4A scripts folder is at : /sdcard/sl4a/scripts
I chose to do everything in there to be available also from inside the
app.

You can now verify that python does not run from the command line,
because no environment is set.

I found this ready-made script that does all the grunt work :
http://blog.anantshri.info/android-standalone-python/

Only it seems that paths move around a lot between Android versions
and/or devices, so I had to correct them for mine :

#! /bin/sh
PW=`pwd`
export EXTERNAL_STORAGE=/mnt/sdcard
export LANG=en
PYTHONPATH=/mnt/sdcard/com.googlecode.pythonforandroid/extras/python
PYTHONPATH=${PYTHONPATH}:/data/data/com.googlecode.pythonforandroid/
files/python/lib/python2.6/lib-dynload
export PYTHONPATH
export TEMP=/mnt/storage/com.googlecode.pythonforandroid/extras/python/
tmp
export PYTHON_EGG_CACHE=$TEMP
export PYTHONHOME=/data/data/com.googlecode.pythonforandroid/files/
python
export LD_LIBRARY_PATH=/data/data/com.googlecode.pythonforandroid/
files/python/lib
cd $PW
/data/data/com.googlecode.pythonforandroid/files/python/bin/python
"$@"

Let's save this to "py.sh" and copy that to the device :
adb push py.sh /sdcard/sl4a/scripts

Then connect back with 'adb shell' and try 'sh py.sh' : if the paths
are OK you should now be in the Python interpreter.
Whew again :-)


Now comes the web2py part. It's not as easy as it should be, due to
some shortcomings in the Android Python distribution.

First, you need version 1.97.1 at least (i used 1.99.4, latest as of
this writing).
Next, even then some things don't work, such as creating an app
directly on the device, because of cache problems :
https://groups.google.com/group/web2py/browse_thread/thread/461ca3eec3fde4e4/9ab612d9c21604ee?hl=fr&lnk=gst&q=android#9ab612d9c21604ee

I worked around this by preparing the web2py environment on the PC
first, then copying it over.

These are the main steps :

* get latest web2py_src.zip
* unzip to temp dir on PC
* run once so that all initialization steps are done, check the admin
app
* stop
* copy your existing app(s) to the web2py applications folders
* (optional) reduce size by deleting example apps, test scripts,
errors etc.
* re-zip to web2py_a.zip
* push to device with adb push web2py_a.zip /sdcard/sl4a/scripts
* connect to shell again and unzip

Note: on my device 'unzip' would fail to extract the archive because
it could not set the permissions.
I had to use 'su' first for it to work (the device was already rooted)

So now we only need a way to start web2py as a daemon.
I created a new 'web2py.sh' shell script, which is the same as py.sh
except for the last two lines :

#! /bin/sh

PW=`pwd`
export EXTERNAL_STORAGE=/mnt/sdcard
export LANG=en
PYTHONPATH=/mnt/sdcard/com.googlecode.pythonforandroid/extras/python
PYTHONPATH=${PYTHONPATH}:/data/data/com.googlecode.pythonforandroid/
files/python/lib/python2.6/lib-dynload
export PYTHONPATH
export TEMP=/mnt/storage/com.googlecode.pythonforandroid/extras/python/
tmp
export PYTHON_EGG_CACHE=$TEMP
export PYTHONHOME=/data/data/com.googlecode.pythonforandroid/files/
python
export LD_LIBRARY_PATH=/data/data/com.googlecode.pythonforandroid/
files/python/lib
cd $PW
cd web2py
/data/data/com.googlecode.pythonforandroid/files/python/bin/python
web2py.py -l '' -a foobar -n 2 -i 127.0.0.1 &

This starts web2py with the following settings :

-l'' : disable logging
-zz foobar: sets the admin app password
-n 2 : two processes only (single user app)
-i 127.0.0.1 : listen on localhost address (no networks needed for on-
device usage)

This prints the web2py startup message and returns.
Disconnecting from adb does not stop the server.
This should work also from SL4A.

Hope this helps,
fp

Reply via email to