【问题标题】:Pyinstaller distributing opencv from Windows 10 to Windows <10, missing ucrt dlls api-ms-win-crtPyinstaller 将 opencv 从 Windows 10 分发到 Windows <10,缺少 ucrt dlls api-ms-win-crt
【发布时间】:2017-09-26 00:51:09
【问题描述】:

我有一个使用 OpenCV 的 Python 3.5 64 位程序(适用于 Windows 的 tensorflow 需要)。我正在使用 pyinstaller 分发它。

我使用 Windows 10 构建了我的程序

/c/Python35/Scripts/pyinstaller -c DeepMeerkat.spec

在我的电脑上,.exe 可以完美构建和运行。在任何其他非 Windows 10 机器上

开启

import cv2

返回

ImportError: DLL load failed: 找不到指定的模块。

我可以在pyInstaller thread 上看到大量关于此的讨论, 但我不知道如何将其付诸实践。 Dependency walker 说我缺少一些 DLL

api-ms-win-crt-**.dll

好的,从 pyInstaller 线程中,我知道这些 DLL 存在

C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs

基于架构的多个子文件夹下。

我尝试添加到我的 .spec 文件中

pathex=["C:/Program Files (x86)/Windows Kits/10/Redist/ucrt/DLLs/"],

或者对于我的特定架构

pathex=["C:/Program Files (x86)/Windows Kits/10/Redist/ucrt/DLLs/arm"],

我认为有人建议here

“安装适用于 Windows 10 的 Windows 软件开发工具包 (SDK) 和 展开 .spec 文件以包含所需的 DLL,请参阅“分发 使用上述链接中“通用 CRT”的软件, 6号。”

这没有任何影响。我收到了数百个错误,例如

121472 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of c:\python35\DLLs\_ssl.pyd

但我可以在这里看到那个 DLL

C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\arm

然后我就从字面上复制了整个文件夹

cp -r "C:/Program Files (x86)/Windows Kits/10/Redist/ucrt/DLLs/" dist/Lib/

但不清楚如何将这些连接到.exe。显然,最好让 pyInstaller 事先知道。

我也试过

/c/Python35/Scripts/pyinstaller --path "C:/Program Files (x86)/Windows Kits/10/Redist/ucrt/DLLs/arm" -c DeepMeerkat.spec

它仍然没有找到它们

我也尝试将该文件夹添加到 PATH。有什么想法吗?

【问题讨论】:

  • 我无法完成这项工作,即使找到了 dll。 “解决方案”是只使用我的安装程序在用户的机器上安装 vcredist_x86.exe,这解决了它,即使它们看起来相同。可能是用户机器上的 PATH 问题。
  • 您使用的是哪个版本的 PyInstaller?上个月发布的 3.3 版修复了 Windows 10 上 Python >=3.5 的问题。
  • 我按照维护者的指示使用了github上的dev分支。

标签: python windows opencv pyinstaller


【解决方案1】:

如果您提供您的规范文件,我会看到发生了什么。从这里看,您可能不包括文件。

这里有两种方法:

  1. 创建包含所有 dll、pyd 文件等的“一个”单个文件...结果是一个大的 exe 文件。
  2. 另一种方法是将其作为文件 + 文件夹填充 dll 文件等...你会得到一个小的 exe 文件。

查看add binary (incl. dll) files here pyinstaller 文档以了解手动包含文件。

查看add data files here pyinstaller 文档以了解手动包含文件。

一个包含您的 dll 文件夹中的 dll 文件的示例规范文件。

block_cipher = None a = Analysis(['minimal.py'], pathex = ['/Developer/PItests/minimal'], binaries = [ ( 'C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs', '.' ) ], datas = [ ('helpmod/help_data.txt', 'helpmod' ) ], hiddenimports = [], hookspath = None, runtime_hooks = None, excludes = None, cipher = block_cipher) pyz = PYZ(a.pure, a.zipped_data, cipher = block_cipher) exe = EXE(pyz,... ) coll = COLLECT(...)

【讨论】:

  • 这里的“二进制文件”或“pathex”似乎是错误的。至少它没有解决“找不到lib:api-ms-win-crt-stdio-l1-1-0.dll”的问题......
  • @Gaetan:我不太清楚您所说的““二进制文件”或“pathex”在这里似乎是错误的”是什么意思。文件损坏、丢失等。您的具体情况是什么情况?如果它是一个新问题......发布一个新问题并在那里发表您的评论。如果它与 OP 的文件路径有关,我只有提供的信息。因此,它作为一个“示例”发布,如前所述;-)
  • 我找到了让它工作的方法。这里的“二进制”部分实际上什么都不做,因为寻找机器 C 运行时 DLL 的循环使用了 pathex。解决方案是添加 ucrt 目录(x86 和 x64)的相对路径,循环只会采用正确的路径。我已将这些小 dll 直接复制到我的项目树中,最大只有 5 Mb,因此无需安装完整的 Windows 10 SDK 即可检索这些 dll。
【解决方案2】:

我需要自己做,但还没有。当我这样做时,我会尝试发布我的完整解决方案。与此同时……

我认为您可能必须明确要求包含它们,而不仅仅是扩展搜索路径。

https://pythonhosted.org/PyInstaller/spec-files.html#adding-binary-files

可能使用他们提到的Tree 类为您收集所有文件。

https://pythonhosted.org/PyInstaller/advanced-topics.html#the-tree-class

【讨论】:

    【解决方案3】:

    我已经看到 PyInstaller 和 Py2exe 无数次无法获取 dll。就个人而言,出于多种原因,我将它们的使用打包成批处理或 bash 以扩展它们的功能。从逻辑上讲,我看到了一个将它们包装在 py 脚本中的论点......

    无论如何,通过包装脚本将依赖项复制到安装包中可能会更容易,而不是与之抗争。

    通常,当您尝试运行它丢失的东西时,您会收到一个 dll 丢失错误。将每个手动添加到目录中,注意您需要包含自己的内容。然后编写脚本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-14
      相关资源
      最近更新 更多