首页 > 解决方案 > Pyinstaller 不会在 jetson 中打包 cv2

问题描述

我有一个使用 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 尝试在此处找到 cv2,/home/mnauf/.local/lib/python3.6/site-packages但没有找到,相应地也没有打包,但是如果您使用 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 目录从打包后复制到 pyinstaller/usr/lib/python3.6/dist-packages创建dist/main的文件夹,但我得到相同的导入错误。

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

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

  4. 在 main.spec 中将 cv2 目录添加为二进制文件路径会给出Import error.

  5. cv2.cpython-36m-aarch64-linux-gnu.so在 main.spec 中仅将路径添加为二进制文件会产生错误Opencv loader

请帮我打包cv2。谢谢

标签: pyinstallercv2nvidia-jetson

解决方案


我复制/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并期望它能够工作。此外,我们得出的结论是,将.so文件路径指定为data filebinary fileinmain.spec是行不通的。


推荐阅读