无法捆绑OpenCV和PyQt5

时间:2017-09-05 08:29:35

标签: python qt opencv pyqt5 pyinstaller

我想将一些python代码捆绑到一个可分发的应用程序(.app文件)中,但是将opencv PyQt5放入应用程序时遇到了麻烦。另一方面, 可以正常工作。

我删除了所有代码,问题仍然存在。请参阅以下代码示例:

# Works absolutely fine
import cv2
print("Hi there opencv v{0} user!".format(cv2.__version__))

# Works absolutely fine
from PyQt5.QtCore import *
print("Qt version {0}".format(QT_VERSION_STR))

# Does not work, see below
import cv2
from PyQt5.QtCore import *
print("Qt version {0}".format(QT_VERSION_STR))
print("opencv version {0}".format(cv2.__version__))

并且通过“不工作”,我的意思是它捆绑没有错误(python3.5 -m pyinstaller samplecode.py),但不能执行。相反,程序退出并返回错误:

Traceback (most recent call last):
  File "/Users/*****/build/test.py", line 1, in <module>
    import cv2
  File "/Users/*****/build/PyInstaller/loader/pyimod03_importers.py", line 631, in exec_module
    exec(bytecode, module.__dict__)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/cv2/__init__.py", line 9, in <module>
    from .cv2 import *
  File "/Users/*****/build/PyInstaller/loader/pyimod03_importers.py", line 714, in load_module
    module = loader.load_module(fullname)
ImportError: dlopen(/Users/*****/build/test/dist/test/cv2.cv2.so, 2): Symbol not found: __ZN10QByteArray11shared_nullE
  Referenced from: /Users/*****/build/test/dist/test/QtTest
  Expected in: /Users/*****/build/test/dist/test/QtCore
 in /Users/*****/build/test/dist/test/QtTest
[20049] Failed to execute script test

星星只是取代我的个人和项目文件夹名称。

我尝试手动复制cv2.so文件,将其重命名为cv2.cv2.so并将其放在文件夹中。这会产生稍微不同的错误:

Traceback (most recent call last):
  File "/Users/*****/build/test.py", line 1, in <module>
    import cv2
  File "/Users/*****/build/PyInstaller/loader/pyimod03_importers.py", line 631, in exec_module
    exec(bytecode, module.__dict__)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/cv2/__init__.py", line 9, in <module>
    from .cv2 import *
  File "/Users/*****/build/PyInstaller/loader/pyimod03_importers.py", line 714, in load_module
    module = loader.load_module(fullname)
ImportError: dlopen(/Users/*****/build/test/dist/test/cv2.cv2.so, 2): Library not loaded: @loader_path/.dylibs/QtGui
  Referenced from: /Users/*****/build/test/dist/test/cv2.cv2.so
  Reason: image not found

我也尝试过cx_freeze和py2app但是也无法使用这些工具。我与pyinstaller的关系最远,它的开发似乎最活跃,所以我更喜欢使用它。

我正在运行MacOS 10.12,并在运行相同操作系统的另一台干净安装的MacBook上重现了该错误。我使用的是Python 3.5.4,PyQt 5.9.1,OpenCV 3.3.0。对于PyInstaller,我尝试过3.2.1和最新的开发。

有人可以帮我理解并解决这个错误吗?

3 个答案:

答案 0 :(得分:1)

我在尝试执行我的app时遇到了同样的错误(使用MacOS 10.11.6),我也使用pyinstaller构建了它。通过将opencv和pyinstaller弃用到以下版本,我能够成功解决我的问题:

pip install opencv-python == 3.1.0.4
pip install pyinstaller == 3.3.1

这不是一个令人满意的解决方案,但如果您仍在努力解决这个问题,可能值得尝试。

答案 1 :(得分:0)

我遇到了很多类似的问题,但是经过一些调查,我通过创建虚拟环境并安装了项目中使用的所有库来解决了问题,然后在该虚拟环境中安装了OpenCV和pyinstaller,如下所示: 激活myEnvironment

> pip install opencv-python 
> pip install pyinstaller

,然后在该虚拟环境中使用pyinstaller创建exe文件。它捆绑了软件所需的所有dll。

答案 2 :(得分:0)

使用https://github.com/pyinstaller/pyinstaller/issues/3426中提到的opencv-python-headless可以为我解决问题。

卸载opencv库,然后

pip install opencv-python-headless

https://pypi.org/project/opencv-python-headless/