Py2exe - win32api.pyc 导入错误 DLL 加载失败

7 投票
4 回答
18153 浏览
提问于 2025-04-15 17:28

我正在尝试使用py2exe来分发我写的一个Python应用程序。一切看起来都很顺利,但当我在另一台机器上运行时,却出现了以下错误:

Traceback (most recent call last):
  File "application.py", line 12, in <module>
  File "win32api.pyc", line 12, in <module>
  File "win32api.pyc", line 10, in __load
ImportError: DLL load failed: The specified procedure could not be found.

我在网上搜索过这个问题,但没有找到太多信息。不过,我尝试了以下建议,但都没有解决问题:

在win32api之前导入了pywintypes和pythoncom(在py2exe的setup.py和主应用程序中)

在setup.py中添加了一些代码 -

# ModuleFinder can't handle runtime changes to __path__, but win32com uses them
import pywintypes
import pythoncom
import win32api
try:
# if this doesn't work, try import modulefinder
    import py2exe.mf as 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

我对这些东西还很陌生,所以任何帮助都将不胜感激

谢谢

乔恩

4 个回答

0

试着把win32api加到你的包里,也就是在选项字典里面。

下面是一个例子:

excludes = ["pywin", "pywin.debugger"] # there will be more in real life...
options = dict(optimize=2,
           dist_dir="build",
           excludes=excludes,
           packages=["win32api"]) 
setup(
    name="MyCoolApp",
    options=dict(py2exe=options),
    # etc ...
2

@Wim,我觉得关于“把这个加到setup.py中的options字典里”的部分有点让人困惑。如果你像我一样,在现有的setup调用中没有options参数,这样的解释可能会更清楚:

setup(name='myprog',     
      ...
      options={"py2exe":{"dll_excludes":[ "mswsock.dll", "powrprof.dll" ]}},
      ...
      )
29

我遇到过这样的问题:一个软件包是在Vista系统上制作的,但在XP系统上运行时出现了问题。后来发现,问题出在py2exe这个工具上,它错误地把powrprof.dllmswsock.dll这两个文件也打包进去了。其实,Windows XP系统本身就有这两个文件的版本,但它无法加载那些跟着你的应用程序一起安装的Vista版本。

把这两个文件从软件包中去掉就解决了这个问题。你可以通过在setup.py文件中的options字典里添加一些内容来轻松做到这一点。

 'dll_excludes': [ "mswsock.dll", "powrprof.dll" ]

撰写回答