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

时间:2018-08-31 18:02:57

标签: python pyinstaller

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

pyinstaller --onefile myscript.py

我使用的包裹:

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

EXE在我的PC上运行良好。但是,当我在另一台PC上尝试时,出现此屏幕快照中显示的错误:https://www.screencast.com/t/msZrURL4v

有什么问题吗?

1 个答案:

答案 0 :(得分:0)

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

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

我可以建议三种互补的方法,绝对不能确切地指出确切的问题(当然,“随机安装某些软件包并查看其是否可以修复”的voodoo方法也可以使用,而且经常可以使用-但这很神奇,而不是计算机科学):

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

然后:

  • 如果该DLL是您的DLL,请了解如何将它们与EXE捆绑包打包。
  • 如果没有,您需要可靠地评估在哪里可以找到它。
    • 很可能是您的建议-安装MSVC可再发行的that-version-other-是绝对正确的。名称类似于MSVCnn ...的库属于该软件包。 MSO ...文件通常属于Microsoft Office可再发行文件。在几个Microsoft软件包中都可以找到MSJET ...文件,例如.NET可再发行文件。
    • 否则,Google和MSDN搜索引擎可能是您的朋友。

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

将要求归纳为一个简短的列表可能是一个漫长的任务,您将需要多次从头重新启动计算机。使用VM,这很容易做到。

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