尝试运行py2exe应用程序时出现MemoryLoadError错误

5

我正在尝试使用py2exe 0.6.9和Python 2.6.4在Windows上打包一个Python应用程序。虽然可执行文件在我构建它的系统上运行得很好,但当我尝试在另一个系统上运行它时,它会失败:

C:\Documents and Settings\Administrator\Desktop\dist>.\backend.exe install
Traceback (most recent call last):
  File "boot_service.py", line 6, in <module>
  File "zipextimporter.pyo", line 82, in load_module
  File "win32serviceutil.pyo", line 9, in <module>
  File "zipextimporter.pyo", line 98, in load_module
ImportError: MemoryLoadLibrary failed loading win32api.pyd

我有强烈的预感缺少一个库,但我不确定是哪个,尤其是因为依赖检查器在目标系统上没有标记任何缺失的内容。我该怎么办?

4个回答

7

https://dev59.com/r0vSa4cB1Zd3GeqPbQ1B相同的问题。

查看setup.py,只需排除包含在系统中的这些dll文件即可。

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

它会帮助您!


1

您可以手动进行dll和依赖项检查。当您生成exe时,我相信您已经注意到它会打印出所需/使用的dll。请在系统上检查exe无法正常工作的位置,看看这些dll是否存在以及它们是否是相同的版本。

还有一件事情。您是将整个dist文件夹复制到系统中,还是只复制了exe?因为您需要整个dist文件夹而不仅仅是exe。


我正在检查 DLL 文件,并且它们确实存在——至少是名字上。依赖项检查器正在确认这一点。我正在复制整个 dist 文件夹,而不仅仅是 exe 文件。 - Benjamin Pollack
那些 DLL 的版本呢?你有检查过吗? - Paul

1
你是在64位/Vista上进行py2exe转换吗?
我一直在Vista 64位上编写代码,创建的.exe文件通常无法在32位XP上运行(这是我手头拥有的两台机器)。.exe会帮助地抛出一个文本文件,其中包含回溯信息,看起来64位Windows使用win32api.dll。我假设这是64位Windows用于复制32位操作系统行为的.dll,因此我只需将相同的脚本转换为32位XP即可。希望这可以帮到你。

0

对于未来到这里的任何人,如果你正在使用任何类型的Win32库并且遇到此类错误,请按以下步骤操作:

  • 问题的原因是Win32函数dll文件与py2exe自动dll文件之间存在冲突。为了解决这个冲突,您需要知道所需函数的dll文件,然后从设置选项中排除这些文件。

例如:

根据以下代码:

import win32crypt
win32crypt.CryptUnprotectData(...)

我使用了CryptUnprotectData函数,因此我搜索了所需的CryptUnprotectData dll,并找到了以下信息enter link description here,如您所见,
需要"Crypt32.dll"。

因此,我编辑了我的setup.py文件,使其看起来像这样

includes = ["win32crypt"]
dll_excludes=["Crypt32.dll"]


setup(
    options = {'py2exe': {'bundle_files': 1, 'compressed': True,'dll_excludes': dll_excludes,'includes': includes}})

它完美地运行了。


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