Differences between revisions 6 and 7
Revision 6 as of 2006-03-20 12:27:38
Size: 2233
Editor: c-71-198-122-123
Comment:
Revision 7 as of 2007-05-03 17:45:48
Size: 2132
Comment: Newer versions osf py2exe use mf.py instead of modulefinder, changed it
Deletions are marked like this. Additions are marked like this.
Line 33: Line 33:
win32com does some magic. There really is no win32com.shell anywhere. win32com does some magic in order to allow loading of COM extensions during run time. The actual extensions reside in the win32comext directory under site-packages and can't be loaded directly. win32com's [http://docs.python.org/tut/node8.html#SECTION008430000000000000000 __path__] variable has been changed to point to both win32com and win32comext. py2exe's modulefinder can't handle runtime changes in __path__ so we have to tell it about the change beforehand.
Line 37: Line 37:
Without shame I browsed [http://cvs.sourceforge.net/viewcvs.py/spambayes/ spambayes source code] and found:

{{{
#!python
# ModuleFinder can't handle runtime changes to __path__, but win32com uses them,
# particularly for people who build from sources. Hook this in.
try:
    import modulefinder
    import win32com
    for p in win32com.__path__[1:]:
        modulefinder.AddPackagePath("win32com", p)
    for extra in ["win32com.shell","win32com.mapi"]:
        __import__(extra)
        m = sys.modules[extra]
        for p in m.__path__[1:]:
            modulefinder.AddPackagePath(extra, p)
except ImportError:
    # no build path setup, no worries.
    pass
}}}

I just added that in top of my setup.py file:
Without shame I browsed [http://cvs.sourceforge.net/viewcvs.py/spambayes/ Spambayes source code] and found the code to fix it.
Line 70: Line 49:
    import modulefinder     # if this doesn't work, try import modulefinder
    import py2exe.mf as modulefinder
Line 85: Line 65:

# ...
# The rest of the setup file.
# ...

The Problem

I used [http://tgolden.sc.sabren.com/python/winshell.html winshell] from Tim Golden - a thin wrapper around Windows Shell-Functions.

winshell.py starts with

   1 from win32com import storagecon
   2 from win32com.shell import shell, shellcon

py2exe learns, that something is missing:

The following modules appear to be missing
['Interface', 'intSet', 'mxDateTime.__version__', 'win32com.shell']

and starting the programm leaves:

Traceback (most recent call last):
  File "xxxxxx.py", line 33, in ?
  File "xxxxxxx.pyo", line 9, in ?
  File "winshell.pyo", line 27, in ?
ImportError: No module named shell

in the log.file.

Explanation

win32com does some magic in order to allow loading of COM extensions during run time. The actual extensions reside in the win32comext directory under site-packages and can't be loaded directly. win32com's [http://docs.python.org/tut/node8.html#SECTION008430000000000000000 path] variable has been changed to point to both win32com and win32comext. py2exe's modulefinder can't handle runtime changes in path so we have to tell it about the change beforehand.

Solution

Without shame I browsed [http://cvs.sourceforge.net/viewcvs.py/spambayes/ Spambayes source code] and found the code to fix it.

   1 # By default, the installer will be created as dist\Output\setup.exe.
   2 
   3 import time
   4 import sys
   5 
   6 # ModuleFinder can't handle runtime changes to __path__, but win32com uses them
   7 
   8 try:
   9     # if this doesn't work, try import modulefinder
  10     import py2exe.mf as modulefinder
  11     import win32com
  12     for p in win32com.__path__[1:]:
  13         modulefinder.AddPackagePath("win32com", p)
  14     for extra in ["win32com.shell"]: #,"win32com.mapi"
  15         __import__(extra)
  16         m = sys.modules[extra]
  17         for p in m.__path__[1:]:
  18             modulefinder.AddPackagePath(extra, p)
  19 except ImportError:
  20     # no build path setup, no worries.
  21     pass
  22 
  23 from distutils.core import setup
  24 import py2exe
  25 
  26 # ...
  27 # The rest of the setup file.
  28 # ...

And this worked.

win32com.shell (last edited 2021-08-24 23:35:23 by JimmyRetzlaff)