py2exe is a program that takes Python code and produces a Windows executable that can run on computers that do not have Python installed. My focus here is in using py2exe
on Python code that depends on SciPy.
py2exe
is itself a Python program, and its latest version is built for Python 2.6. The code I want it to compile is written with Python 2.5 because the latest version of SciPy depends on Python 2.5. How do I tell py2exe
that my code uses an earlier version of Python?
It took me a while to realize this, but py2exe
has two version numbers: one for the version of py2exe
and one for the version of Python. The key was to download and install py2exe-0.6.9.win32-py2.5.exe
. This is the latest version of py2exe
(version 0.6.9) for an earlier version of Python (version 2.5). The py2exe
software runs in the same version of Python as the code it is compiling.
I tested py2exe
on a script hellpscipy.py
as follows:
from scipy.special import gamma print "Gamma(1/2) = ", gamma(0.5)
The instructions given in the py2exe tutorial don’t quite work because of the dependence on SciPy, but the site gives an example of how to modify the setup.py
file to specify the dependence on SciPy. Here’s where things get a little murky. The instructions don’t say exactly how to modify the setup.py
file, but they give strong hints. I know my code depends on scipy.special
, but I don’t know what further dependencies I might have. Here’s the setup file I used.
from distutils.core import setup import py2exe excludes = [] includes = ["scipy.special"] opts = { "py2exe": { "includes":includes, "excludes":excludes } } setup(console=['helloscipy.py'], options=opts)
This worked. The output listed 94 additional SciPy dependencies that I might need to include, some of which were clearly not needed. I was pretty sure, for example, that my program did not need email.Utils
. Apparently I didn’t need any of these because the code worked fine.
It’s not clear just what files need to be distributed along with the .exe
file that py2exe
produces. py2exe
creates a dist
directory with the .exe
file as well as other files that you might need, primarily .dll
and .pyd
files. Many of these were obviously unnecessary. I knew, for example, that my little command line program did not depend on Tk graphics. I deleted these and the code worked fine as expected.
Import scipy.stats doest seem to work with this method
for scipy.special, I get an error
ImportError: No module named _ufuncs_cxx