【问题标题】:PyInstaller ImportError DLL not found when testing EXE on other computer在其他计算机上测试 EXE 时找不到 PyInstaller ImportError DLL
【发布时间】:2019-02-06 19:05:47
【问题描述】:

我使用 PyInstaller 从 Python 脚本构建了一个 EXE 文件,使用

pyinstaller --onefile myscript.py

我使用的包:

pandas, numpy, imutils, opencv, logging, os, random, json, string, csv, datetime, uuid

EXE 在我的电脑上运行良好。但是,当我在另一台 PC 上尝试时,我会收到此屏幕截图中显示的错误:https://www.screencast.com/t/msZrURL4v

知道问题出在哪里吗?

【问题讨论】:

  • 据我所知,python 有两种不同的依赖类型。一个是您可以包含一个全局安装在您的计算机上的库,它允许您为您的 PC 上的不同 python 代码保留一个库的副本。第二个是你在你的仓库中保留一个库的副本,所以当你创建一个可执行文件时,它不需要运行 pc 来安装所有这些依赖项。
  • 我的意见“您尝试将内置/系统范围的库称为外部库”Portablebuilt-in 完全不同的东西。一些包有performance 问题(所以不能直接移植/共享到另一个应用程序),你能想象“你的应用程序如何处理所有导入模块上的 sym-links/mem-alloc 吗?”。如果你没有性能问题,可以使用通用的DLL库。如果没有任何系统分析,您将无法在另一台计算机上运行您的程序。可能产生问题的库:pandas、numpy、imutils、opencv
  • 您可以通过使用 ctypes 来克服这些问题(导致非常严重的性能损失)。您可以创建一个 DLL 并将其插入到所有非工作模块中。我知道这很烦人,但我想不出另一种方法来最小化依赖关系。
  • @dsgdfg 感谢您的回复。你能准确地告诉我我需要做什么吗?我不知道你刚才说的该怎么做。

标签: python pyinstaller


【解决方案1】:

您发布的错误只是说“我正在寻找一个特定的 DLL,但没有找到它”。

您现在需要准确地确定找不到正确的 DLL,而不是安装可能包含或不包含正确 DLL 的其他包和扩展。

我可以建议三种互补的方法,但没有一个绝对可以确定确切的问题(当然,“随机安装一些软件包并查看它是否修复它”的巫术方法也可能有效,而且经常有效——但这很神奇,而不是计算机科学):

  • 最快:检查pyimod03_importers.py文件第714行,看看抛出异常时它在做什么。由于 Windows 的库加载策略,您可能会遇到一个红鲱鱼,报告一个文件实际上不存在,因为它依赖于第二个丢失的文件,该文件的名称不会告诉您。
  • 最简单的方法:使用 SysInternals 的 DEPENDS.EXE 之类的工具来检查 OMR.EXE 文件。这几乎可以保证在这种情况下不起作用,因为所需的导入可能以 Python 格式指定,而不是 DEPENDS.EXE 可以识别的任何形式。
  • 最全面,但最不简单:使用像 SysInternals 的 PROCMON 这样的工具,设置过滤器以排除 Windows 空闲状态的背景噪音 - 会有很多这样的 - 然后假运行 OMR.EXE ;排除由此产生的额外噪音。您需要设置大约四十个过滤器。最后运行OMR.EXE。接近尾声时,您会看到一系列尝试加载 SOMETHING.DLL,均失败;第一个是 DLL 应该位于的位置(通过 Python 或 OMR),其他都是合适的替代方案。

然后:

  • 如果 DLL 是您的一个,请了解如何将它们与 EXE 捆绑包一起打包。
  • 如果不是,您需要可靠地评估在哪里可以找到它。
    • 很可能您给出的建议 - 安装 MSVC 可再发行版本或其他 - 绝对正确。名称如 MSVCnn... 的库属于该包。 MSO... 文件通常属于 Microsoft Office 可再发行文件。 MSJET... 文件位于多个 Microsoft 包中,例如 .NET 可再发行组件。
    • 否则,Google 和可能的 MSDN 搜索引擎就是您的朋友。

根据以往的经验,我建议设置一个虚拟机进行测试,然后查看需要哪些包。这是因为第一次 DLL 崩溃会隐藏任何后续的崩溃,您可能需要多次重复上述步骤。您需要的第一个库由 NETFX64 包提供,第二个由 Microsoft Office 运行时提供这一事实可能是正确的,但是当您发现需要第二个库时,您可能还会发现 MSO 运行时会提供第一个也;所以在那个时候,而不是之前,您会发现 NETFX64 包并不是真正需要的,并且可以将您的安装要求简化为单独的 MSO 运行时。

将需求归结为一个简短的列表可能是一项冗长的任务,并且您需要不止一次地从头开始重新启动机器。使用虚拟机,这很容易做到。

(我一直提到 MSO 运行时,因为我认为您的程序将处理复选框答案模块,并且可能需要或相信它需要 MSO 运行时提供的一些扫描仪识别功能。如果是这样,他们可能会排在最后)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-06
    • 1970-01-01
    • 2021-03-08
    相关资源
    最近更新 更多