myppy: make you a portable python
Myppy is a set of tools for building and managing a portable python environment. The end result is something similar in spirit to portable python but can be built for a variety of different platforms.
Currently targeted build environments are linux-i686 and OSX. There is some initial support for win32 but I need to figure out a lot of finer details of the build process.
The secret sauce is basically:
- Using the Linux Standard Base SDK on Linux, to avoid linking against but the most portable of symbols.
- Setting MACOSX_DEPLOYMENT_TARGET to the lowest available version, and building universal binaries on OSX.
- Setting the rpath or loader_path on all shared libs to a sensible value, so that their deps can be found regardless of where the myppy env is located.
Some things haven't quite been sorted out yet:
- Scripts installed by easy_install and pip embed the absolute path to the interpreter in the shebang line; they should be replaced by a loader stub that finds python at runtime.
- distutils and sysconfig embed the absolute library paths as they were at build time, meaning you can't properly build C-extensions if you move the environment around. They should be patched in a simlar way to virtualenv.
Building a myppy environment
To build a myppy environment, you'll need some basic command-line build tools and a recent version of gcc. Initialise a new myppy env with the following command:
#> myppy PATH/TO/ENV init
This will build and set up a basic python installation (currently python 2.7.3) along with setuptools and pip. Most python packages can be installed directly using pip. For packages with more complex needs a myppy "recipe" is provided, and you can install them using e.g.:
#> myppy PATH/TO/ENV install py_wxpython
This would build and install a custom wxPython version that is patched to be more portable.
Using a myppy environment
In the top level of a myppy environment there are three shell scripts named "python", "myppy" and "shell". These set up some relevant environment vars and then chainload the appropriate command.
Here's how you might get a shell inside a myppy envionment, then install a third-party package using pip:
#> #> PATH/TO/ENV/shell myppy(ENV):$ myppy(ENV):$ pip install esky ...lots of output as esky is installed... myppy(ENV):$ myppy(ENV):$ <ctrl-D> #>
What is it good for?
Why, everything that something like portable python is good for, but on Linux or OSX instead of Windows! Use it as a convenient portable scripting or testing environment, or to run multiple python versions side-by-side.
One thing it's particularly good for (actually, the reason it was created) is building frozen Python apps. Myppy comes with recipes for patched of cx-freeze and py2app that will build stand-alone applications having the same portability as the myppy env itself - meaning they should run anywhere from ancient Red Hat distros to the latest Ubuntu release.