Differences between revisions 9 and 10
Revision 9 as of 2010-06-03 06:36:38
Size: 2173
Editor: techtonik
Comment: real problem caused by this module
Revision 10 as of 2010-06-03 06:52:31
Size: 2829
Editor: techtonik
Comment: make the problem more visible https://sourceforge.net/tracker/?func=detail&atid=115583&aid=3004240&group_id=15583
Deletions are marked like this. Additions are marked like this.
Line 4: Line 4:
I used [[http://tgolden.sc.sabren.com/python/winshell.html|winshell]] from Tim Golden - a thin wrapper around Windows Shell-Functions. py2exe fails to find imported win32com.shell module.
Line 6: Line 6:
winshell.py starts with For example version 0.2 of [[http://tgolden.sc.sabren.com/python/winshell.html|winshell.py]] from Tim Golden (a thin wrapper around Windows Shell-Functions) starts with:
Line 13: Line 13:
py2exe learns, that something is missing:
py2exe reports that something is missing:
Line 20: Line 19:
and starting the programm leaves: and starting the program leaves:
Line 73: Line 72:

= Impact =

The following products included workaround:
* Spambayes
* Mercurial
* hgsvn

= Ideal proposal =

py2exe should detect such well-known problems with well-known modules, and when win32com.shell is missing, a workaround should be automatically applied with a corresponding log message:
{{{
The following modules appear to be missing
['Interface', 'intSet', 'mxDateTime.__version__', 'win32com.shell']
Applying automatic workaround for known problem with win32com.shell
}}}

py2exe should also fail if required modules are missing unless some '--force' key in effect.

The Problem

py2exe fails to find imported win32com.shell module.

For example version 0.2 of winshell.py from Tim Golden (a thin wrapper around Windows Shell-Functions) starts with:

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

py2exe reports that something is missing:

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

and starting the program 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 __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 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.

Impact

The following products included workaround: * Spambayes * Mercurial * hgsvn

Ideal proposal

py2exe should detect such well-known problems with well-known modules, and when win32com.shell is missing, a workaround should be automatically applied with a corresponding log message:

The following modules appear to be missing
['Interface', 'intSet', 'mxDateTime.__version__', 'win32com.shell']
Applying automatic workaround for known problem with win32com.shell

py2exe should also fail if required modules are missing unless some '--force' key in effect.

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