Pyinstaller 不在 jetson 中打包 cv2

Pyinstaller doesnt package cv2 in jetson

我有一个软件,我使用 pyinstaller 在 x86 处理器中打包,它打包了所有库,包括 cv2,但是,当我尝试在 Jetson TX2 中打包相同的软件时,它不打包 cv2 并在执行时抛出错误二进制文件:

OpenCV loader: missing configuration file: ['config.py']

原因是 cv2 预安装在 TX2 的不同位置 (/usr/lib/python3.6/dist-packages)。但是,我们自己安装的其余库都在 (/home/mnauf/.local/lib/python3.6/site-packages) 中,也许这就是 pyinstaller 无法打包它的原因。

pyinstaller 尝试在 /home/mnauf/.local/lib/python3.6/site-packages 处找到 cv2,但没有找到,因此也没有打包,但是如果您使用 python,cv2 可以正常导入。 cv2 与 python 一起工作的原因是我假设 python 首先尝试在 /home/mnauf/.local/lib/python3.6/site-packages 中找到一个库,如果不成功,则在 /usr/lib/python3.6/dist-packages.

中找到

为了解决打包问题,我尝试了以下方法,下面讨论的错误都是在执行二进制文件时出现的,而不是在打包时出现的:

  1. 正在将 cv2 从 /usr/lib/python3.6/dist-packages 复制到 /home/mnauf/.local/lib/python3.6/site-packages。它给出:

ImportError: ERROR: recursion is detected during loading of "cv2" binary extensions. Check OpenCV installation.

  1. 我尝试将 cv2 目录从 /usr/lib/python3.6/dist-packages 复制到打包后由 pyinstaller 创建的 dist/main 文件夹,但我得到相同的导入错误。

  2. main.spec 中将 cv2 目录路径添加为数据文件也只会将文件夹复制到 dist/main,因此会出现相同的导入错误。

  3. 仅将 cv2.cpython-36m-aarch64-linux-gnu.so 路径作为数据文件添加到 main.spec 中会出现 Opencv loader 错误。

  4. 将 cv2 目录作为二进制文件路径添加到 main.spec 中得到 Import error.

  5. 仅将 cv2.cpython-36m-aarch64-linux-gnu.so 路径作为二进制文件添加到 main.spec 中会出现 Opencv loader 错误。

请帮我打包cv2。谢谢

我将 /usr/lib/python3.6/dist-packages/cv2/python-3.6/cv2.cpython-36m-aarch64-linux-gnu.so 复制到 /home/mnauf/.local/lib/python3.6/site-packages/,然后从 python 导入了 cv2,并通过以下操作检查了它的导入位置:

import cv2
cv2.__file__

它返回了我想要的路径,即 /home/mnauf/.local/lib/python3.6/site-packages/。一旦确信 cv2 确实在使用我想要的目录,我 运行 pyinstaller 并确实打包了 cv2 依赖项。

之前,我在创建可执行文件之前复制了整个文件夹。这次我只复制了 .so 文件,然后创建了可执行文件并且它起作用了。

而且我认为“在创建可执行文件之前”也是诀窍。您不能只将 .so 文件复制到 dist/main 并期望它能正常工作。此外,我们得出结论,在 main.spec 中将 .so 文件路径指定为 data filebinary file 是行不通的。