Compiling Python Code (maybe tooooooooooold)
Python source code is automatically compiled into Python byte code
by the CPython interpreter. Compiled code is usually stored in PYC (or
PYO) files, and is regenerated when the source is updated, or when
otherwise necessary.
To distribute a program to people who already have Python installed,
you can ship either the PY files or the PYC files. In recent versions,
you can also create a ZIP archive containing PY or PYC files, and use
a small “bootstrap script” to add that ZIP archive to the path.
To “compile” a Python program into an executable, use a bundling
tool, such as
Gordon McMillan’s installer
(
alternative download
) (cross-platform),
Thomas Heller’s py2exe
(Windows),
Anthony Tuininga’s cx_Freeze
(cross-platform),
or Bob Ippolito’s
py2app
(Mac). These tools
puts your modules and data files in some kind of archive file, and creates
an executable that automatically sets things up so that modules are
imported from that archive. Some tools can embed the archive in the
executable itself.
If all you need is to wrap up a couple of Python scripts and
modules into a single file,
Squeeze
might be what
you need. For Windows, my
ExeMaker
tool can also
be quite useful (on its own, or in combination with squeeze).
Compiling Python modules to byte code
#
Python automatically compiles Python source code when you import
a module, so the easiest way to create a PYC file is to import it.
If you have a module mymodule.py, just do:
>>> import mymodule
to create a mymodule.pyc file in the same directory.
A drawback is that it doesn’t only compile the module, it also
executes it, which may not be what you want. (however, it does
compile the entire script even if it fails to execute the script).
To do this programmatically, and without executing the code,
you can use the py_compile
module:
import py_compile
py_compile.compile("mymodule.py")
There’s also a compileall
module which can be used to compile all modules in an entire directory
tree.
import compileall
compileall.compile_dir("mylib", force=1)More on byte code
#
Python’s byte code is portable between platforms, but not necessarily
between Python releases. The imp.get_magic() function returns a
4-byte string identifying the byte code format used by the current interpreter.
You can use the compile function and
the marshal module
to compile Python code into code objects, and convert such code objects
to binary strings. To reverse this process, use marshal to convert
from strings to code, and use exec to execute code.