bbfreeze - create stand-alone executables from python scripts
Overview
bbfreeze creates stand-alone executables from python scripts. It's
similar in purpose to the well known py2exe for windows, py2app for
OS X, PyInstaller and cx_Freeze (in fact ancient versions were based
on cx_Freeze. And it uses the modulegraph package, which is also used by
py2app).
It has the following features:
- easy installation
- bbfreeze can be installed with setuptools' easy_install command.
- zip/egg file import tracking
- bbfreeze tracks imports from zip files and includes whole egg files
if some module is used from an eggfile. Packages using setuputils'
pkg_resources module will now work (new in 0.95.0)
- binary dependency tracking
- bbfreeze will track binary dependencies and will include DLLs and
shared libraries needed by a frozen program.
- multiple script freezing
- bbfreeze can freeze multiple scripts at once.
- python interpreter included
- bbfreeze will create an extra executable named 'py', which might be
used like the python executable itself.
- automatic pathname rewriting
- pathnames in tracebacks are replaced with relative pathnames
(i.e. if you import package foo.bar from /home/jdoe/pylib/
tracebacks generated from functions in foo.bar will not show your
local path /home/jdoe/pylib/foo/bar.py. They will instead show
foo/bar.py)
bbfreeze works on windows and UNIX-like operating systems. It
currently does not work on OS X. bbfreeze has been tested with python
2.4 and 2.5. bbfreeze will not work with python versions prior to 2.3
as it uses the zipimport feature introduced with python 2.3.
Installation
You need to have setuptools/easy_install installed. Installation
should be as easy as typing:
easy_install bbfreeze
This should download bbfreeze and it's dependencies modulegraph and
altgraph and install them.
Limitations
- bbfreeze does not work on OS X
- documentation
bbfreeze - API
The preferred way to use bbfreeze is by writing short python scripts,
which use bbfreeze's API. Let's start with a short example:
from bbfreeze import Freezer
f = Freezer("hello-world-1.0", includes=("_strptime",))
f.addScript("hello-world.py")
f.addScript("hello-version.py")
f() # starts the freezing process
bbfreeze.Freezer(distdir="dist", includes=(), excludes=())
instantiates a Freezer object. It will create the frozen executables
and dependencies inside the distdir directory. includes is a list
or tuple of modules to include, excludes is a list or tuple of
modules to exclude. Note that the freezer will delete the directory
distdir before freezing!
bbfreeze.Freezer objects have the following members:
- use_compression: flag whether to use compression inside the created
zipfile (default True).
- include_py: flag whether to create the included python interpreter
py (default True)
- addScript(path, gui_only=False): register a python script for
freezing. path must be the path to a python script.
The freezer will scan the file for dependencies and will create an
executable with the same name in distdir. The gui_only flag only
has a meaning on windows: If set, the executable created for this
script will not open a console window.
Recipes
Recipes provide a way to control the freezing process. Have a look at
bbfreeze/recipes.py if you need to implement your own. Note that the
API might change.
Change-Log
2008-8-29 release 0.96.4
- record previously missing dependencies for subpackage imports. This
bug only showed up when dependencies where explicitly removed.
2008-8-18 release 0.96.3
- fix issues with some packages, which where wrongly
recognized as development eggs
2008-8-5 release 0.96.2
- a slightly patched getpath.c from python trunk has been
added. This should fix sys.getfilesystemencoding() for statically
linked python. We also try to link with the static library in case
the shared one has been linked with -Bsymbolic (which makes it
impossible to override the necessary symbols). This happens e.g. on
Ubuntu 8.04.
- __file__ in the main program now has a .py suffix. This prevents
garbage output from the warnings module.
- some recipes have been added (mostly breaking some unneeded
dependencies).
- explicit recipes for the email module have been added. the email
module isn't added as a whole.
- the setup script now reports the configuration used.
- bbfreeze now tracks dependencies from eggs (i.e. dependencies
specified in the egg's setup.py script).
2008-3-14 release 0.96.1
- fix bug in an internal function, which determines if eggs should
be used. It always returned False, so eggs where never packaged.
2008-3-13 release 0.96.0
- some egg packages have the site-packages directory as their
location, which resulted in the whole site-packages directory being
copied as some egg file.
- fix issue with wxPython
- add recipe for mercurial
- handle development eggs ("python setup.py develop") by running
setup.py bdist_egg
- handle easy install entry scripts
- add recipe for kinterbasdb (thanks to Werner F. Bruhin)
- fix LD_RUN_PATH issue, when --enable--new-dtags is the default for
linking (e.g. on gentoo). (thanks to Collin Day)
2007-12-6 release 0.95.4
- workaround for virtualenv
- show execution time in py
2007-10-16 release 0.95.3
- recipes for pythoncom/pywintypes have been added
- make sys.getfilesystemencoding() work like in non-frozen versions
- automatic pathname rewriting
- make stdin, stdout and stderr unbuffered in frozen programs
2007-7-12 release 0.95.2
- fix issues with c modules with suffix 'module.so',
e.g. zlibmodule.so, timemodule.so, ... (fedora core 7 uses that
naming scheme; thanks to Neil Becker for reporting)
The frozen executable did bail out with zipimport.ZipImportError:
can't decompress data; zlib not available".
2007-7-11 release 0.95.1
- compile .py files from eggs when there is no accompanying .pyc file
- skip egg/zip files in find_all_packages (makes some recipes work)
2007-7-6 release 0.95.0
- support for egg files: bbfreeze scans zipped egg files and now
includes whole egg files/directories in the distribution. Programs
using setuptools' pkg_resources module will now work (thanks to
Eirik Svendsen for testing this).
2007-6-28 release 0.94.1
- fix bug in setup script, now the patched modulegraph is really used
- better recipe handling
2007-6-22 release 0.94.0
- support relative imports (backported from modulefinder, bbfreeze now
ships with its' own patched copy of modulegraph).
- fix xml/_xmlplus issues
- add recipe for cElementTree
2007-5-31 release 0.93.2
- include tcl/tk runtime files (really makes Tkinter work)
- exclude gtk, pango and friends (i.e. they must be installed on
the target system)
2007-5-14 release 0.93.1
- make py executable work when readline is not installed
- fix dll search path issue (makes Tkinter work)
2007-5-3 release 0.93.0
- dependency on libpython.so should now always be recognized
- support for namespace packages
- basic support for zipfiles/eggs (bbfreeze will scan zipfiles/eggs
for dependencies and will implement a dummy pkg_resources.require in
frozen executables). Note that the remaining pkg_resources
functionality just isn't available.
- documentation updates
2007-4-27 release 0.92.0
- better binary dependency cache handling
- fix recipe for time module on windows
- use pefile module on windows for binary dependency tracking
- add gui_only flag to addScript method (which builds GUI programs
on windows, i.e. without console)
- strip shared libraries on non windows platforms
- add showxref method
- working recipe for py.magic.greenlet
2007-4-24 Initial release 0.91.0
LICENSE
bbfreeze contains a modified copy of modulegraph, which is distributed
under the MIT license and is copyrighted by Bop Ippolito.
bbfreeze contains a modified copy of getpath.c from the python
distribution, which is distributed under the python software
foundation license version 2 and copyrighted by the python software
foundation.
The remaining part is distributed under the zlib/libpng license:
Copyright (c) 2007, 2008 brainbot technologies AG
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
- The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
- Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
- This notice may not be removed or altered from any source
distribution.