PackageLoader issues

If you get a message like ImportError: cannot import name factorial (see http://article.gmane.org/gmane.comp.python.py2exe/3324 or http://mail.scipy.org/pipermail/scipy-user/2009-May/021216.html), this is due to a failure in a somewhat-magical mechanism that Scipy uses to import symbols into the top-level scipy module. Rather than, e.g., from scipy.x.y import *, it uses a Numpy mechanism called PackageLoader, which uses info.py files in each submodule to know what symbols to import. Those files do seem to be making it into the py2exe distribution, but they're not getting used correctly. I'm not sure if the bug is scipy or py2exe.

A hackish workaround is to modify scipy/__init__.py to explicitly import the symbols you need, e.g., from scipy.misc import factorial.

Brian K. Boonstra

The problem

When using py2exe with scipy, you end with messages about missing modules. Some of them may not end up mattering (as in my case where scipy_base.add was missing) but others do, notably __cvs_version__ modules of some scipy packages, plus the cephes module.

The solution

You just need a few includes. Here is what I have:

excludes = []
includes = ["scipy.special.__cvs_version__", "scipy.linalg.__cvs_version__", "scipy.special.cephes"]

opts = {
    "py2exe": {
        "includes":includes,
        "excludes":excludes
    }
}

setup(...
     com_server=['myserver'],
     options=opts
        )

but if your code actually uses more of the scipy packages, you might need to add a few more __cvs_version__ entries.


CategoryHomepage

ScipyImportProblems (last edited 2010-07-08 17:36:50 by KennethArnold)