From: Thomas H. <th...@ct...> - 2007-09-06 19:12:16
|
Grant Edwards schrieb: > On 2007-09-06, Thomas Heller <th...@ct...> wrote: > >>> The patch against 0.6.6 is at >>> >>> ftp://ftp.visi.com/users/grante/python/py2exe-0.6.6-pyd-name-collision.patch >> >> Thanks for the patch, I'm currently looking at it. Can you please also >> provide a short script (some Numeric or numpy operations, maybe) that >> demonstrates the problem in 0.6.6 and that the patch fixes it? > > Here's the program that's being bundled > > ------------------------------collision.py------------------------------ > import Numeric > import numpy > > print Numeric > print numpy > ------------------------------------------------------------------------ > > > Here's the setup script: > > ----------------------------collision-setup.py-------------------------- > # setup.py > from distutils.core import setup > import py2exe,shutil > > setup(console=[{"script":"collision.py"}], > name = "pyd namespace collision demo", > options = {"py2exe": {"skip_archive":1}} > ) > > shutil.copy('c:/Python24/lib/site-packages/numpy/core/_internal.pyc','dist/numpy/core/_internal.pyc') > ------------------------------------------------------------------------ > > Here's what happens when you run collision.exe that was bundled > with unpatched 0.6.6: > > ------------------------------old.out------------------------------ > import core -> failed: cannot import name typeinfo > import lib -> failed: cannot import name typeinfo > import linalg -> failed: cannot import name typeinfo > import dft -> failed: cannot import name typeinfo > import random -> failed: 'module' object has no attribute 'dtype' > Traceback (most recent call last): > File "collision.py", line 2, in ? > import numpy > File "numpy\__init__.pyc", line 49, in ? > File "numpy\add_newdocs.pyc", line 2, in ? > File "numpy\lib\__init__.pyc", line 5, in ? > File "numpy\lib\type_check.pyc", line 8, in ? > File "numpy\core\__init__.pyc", line 7, in ? > File "numpy\core\numerictypes.pyc", line 82, in ? > ImportError: cannot import name typeinfo > -------------------------------------------------------------------- > > > And here's what happens with the patch > > -----------------------------new.out-------------------------------- > <module 'Numeric' from 'v:\py2exe\mytest\dist\.\Numeric.pyc'> > <module 'numpy' from 'v:\py2exe\mytest\dist\.\numpy\__init__.pyc'> > -------------------------------------------------------------------- I see the same behaviour as you now. > You don't actually need the 'print' statements -- merely > importing the two packages will fail without the patch. [I've > never looked into the question of why py2exe doesn't include > _internal.pyc in numpy, but if you don't copy that file > manually, that will also cause import numpy to fail.] I have no idea why _internal.pyc is not included. Maybe we have different Numeric versions or whatever (but I'm also too tired to investigate this now). Also note that py2exe does NOT include the whole numpy package by default, instead it uses modulefinder which parses import statements in the .pycs bytecode and includes the modules that it finds there. If you want to make sure that whole packages are included completely (modulefinder does not understand all the fancy ways that some packages use to import modules), or you want to force inclusion of modules that are needed but not found by modulefinder, you should use the '--packages' or '--includes' command line options or the corresponding setup script options. Oh, and I didn't know you were using the "skip-archive" option - I didn't even remember that it exists at all since I never used it. For this case, it would probably make more sense to copy the .pyds into the directory where they belong to, instead of renaming them and have them in the top-level dist directory. However, it does work so I'm not sure this should still be changed. Thomas |