【问题标题】:Py2exe - win32api.pyc ImportError DLL load failedPy2exe - win32api.pyc ImportError DLL 加载失败
【发布时间】:2009-12-30 10:32:30
【问题描述】:

我正在尝试使用 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

我对这一切都很陌生,所以任何帮助将不胜感激

谢谢

乔恩

【问题讨论】:

    标签: python py2exe


    【解决方案1】:

    当包是在 Vista 上构建但在 XP 上执行时,我已经看到了这个问题。问题原来是py2exe错误地将powrprof.dllmswsock.dll添加到包中。不过,Windows XP 包含这些文件的自己的副本,并且无法加载随您的应用安装的 Vista 文件。

    从包中删除它们就可以了,您可以通过将其添加到 setup.py 中的 options dict 来轻松完成此操作

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

    【讨论】:

    • 非常感谢!成功了,现在一切正常
    • 我们也看到了同样的情况,使用 Dependency Walker 工具 powrprof.dll 出现在依赖列表中。将其添加到“dll_excludes”后,它工作正常。
    • 请注意,默认情况下,py2exe 不会清除分发目录的内容,因此如果您之前尝试安装软件,“mswsock.dll”和“powrprof.dll”文件将即使在全新安装之后仍然存在(一旦您在上面添加了“dll_excludes”行)。请务必在重新运行 py2exe 之前删除分发目录。
    【解决方案2】:

    @Wim,我发现关于“将其添加到 setup.py 中的选项字典”的内容有点令人困惑。如果像我一样,您在现有的 setup 调用中没有选项 arg,这可能会让事情更清楚:

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

    【讨论】:

      【解决方案3】:

      尝试在选项字典中将 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 ...
      

      【讨论】:

        【解决方案4】:

        就像添加的评论一样。使用 Py2exe 重建程序时,请务必删除旧的“dist”目录。我坐了 3 个多小时不明白为什么我的应用程序在我的开发环境中运行而不是在生产环境中运行。删除 dist 并使用 py2exe 重新构建,它可以工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-21
          • 2012-02-02
          • 1970-01-01
          • 2020-03-31
          • 2021-07-25
          • 2021-04-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多