在其他计算机上测试EXE时找不到PyInstaller ImportError DLL

vdv*_*xel 7 python pyinstaller

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

pyinstaller --onefile myscript.py
Run Code Online (Sandbox Code Playgroud)

我用的包:

pandas, numpy, imutils, opencv, logging, os, random, json, string, csv, datetime, uuid
Run Code Online (Sandbox Code Playgroud)

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

知道问题是什么吗?

LSe*_*rni 0

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

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

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

  • 最快的:检查 pymod03_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 运行时提供的。如果是这样,他们会可能排在最后)。