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

7

我想使用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.

我已经搜索了很多,但没有找到很多信息,尝试了以下建议但都无济于事:

在py2exe的setup.py和主应用程序中,在win32api之前导入pywintypes和pythoncom。 在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

我对这些都很陌生,所以非常感谢任何帮助。

谢谢

Jon

4个回答

29

我曾经遇到过这个问题,当时是在Vista上构建的软件包在XP上执行。问题原因是py2exe错误地将powrprof.dllmswsock.dll添加到了包中。然而Windows XP自带这些文件,并且无法加载安装在你的应用程序中的Vista版本。

从软件包中删除它们可以解决问题,你可以通过在setup.py中的options字典中添加以下内容来轻松完成此操作:

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

非常感谢!那个有效了,现在一切都完美运行。 - user240788
我们也遇到了类似的问题,使用 Dependency Walker 工具查看依赖列表时发现 powrprof.dll 出现在其中。将其添加到“dll_excludes”中后,程序可以正常运行。 - Ivo
3
请注意,默认情况下,py2exe不会清空发行目录的内容。因此,如果您之前尝试安装了软件,则即使在进行新的安装(在添加了上面的“dll_excludes”行后),'mswsock.dll'和'powrprof.dll'文件仍将存在。请务必在重新运行py2exe之前删除发行目录。 - ishmael

2

@Wim,我认为“在setup.py中添加这个到options字典”这一部分有点令人困惑。如果像我一样,在你现有的调用setup时没有选项参数,那么这可能会使事情更清晰:

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

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 ...

0
只是附带评论。在使用 Py2exe 重新构建程序时,请务必删除旧的 "dist" 目录。我坐了三个多小时,不理解为什么我的应用程序在开发环境中可以运行而在生产环境中不能运行。删除 dist 并使用 py2exe 重新构建即可解决问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接