py2app: Packaging wxGlade
In order to see how hard it would be to package a complicated application such as wxGlade, I decided to give it a try. wxGlade is quite a dynamic beast with regard to code generation and widget plugins, so it was a bit of a pain to deal with. I actually had to add several features to py2app in the process:
- A feature where one module can be "aliased" to another module. I needed this because wxPython.wx points to wx, but is not actually on the filesystem.
- An extensible module filtering system, so a recipe can say "yes" or "no" to any extension or python module it comes across. Before this, there was only one static filter that would say "no" to standard library modules when using a vendor Python.
wxGlade causes problems because it needs to list the "codegen" and "widgets" directories, and load code from them. This would be easy if:
- The path were configurable in some way (using sys.path, a separate variable, etc.). Packages go into .../Python/site-packages/, where it expected to see them at .../
- The list of modules were configurable in some way (right now it expects to perform an os.listdir)
The naive way would be to just include them as data files, however this prevents dependency analysis from occurring. It turns out that wxGlade did indeed cause new dependencies in these modules so a more complicated solution was required. The solution to this particular problem is in three parts:
- Add "codegen" and "widgets" as data files
- Add a wxglade recipe that scans all of these plugins for dependencies
- Have the wxglade recipe install a filter that makes sure these dependencies aren't copied into the normal place
The other customization I used was a custom boot script, wxGlade.py. This boot script does two things:
- Starts up wxGlade as per wxglade.py, but in a simpler way (less is needed, the environment is already sane)
- Monkeypatches a bug in wxGlade so that it can open the help files
The example setup.py and bootstrap wxGlade.py are located at: http://undefined.org/python/wxGlade-0.3.4-py2app.tgz
Note that setup.py expects a wxGlade 0.3.4 distribution to be unpacked in ./wxGlade-0.3.4