【问题标题】:Unable to bundle OpenCV and PyQt5无法捆绑 OpenCV 和 PyQt5
【发布时间】:2018-02-13 11:28:51
【问题描述】:

我想将一些 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 和最新的开发。

谁能帮我理解和解决这个错误?

【问题讨论】:

    标签: python qt opencv pyqt5 pyinstaller


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      > pip install opencv-python 
      > pip install pyinstaller
      

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

      【讨论】:

      • 即使我有一个项目,OpenCV / Numpy 在同一个项目中有问题。我确实按照你的指示在最后安装了 opencv / pyinstaller - 仍然失败并继续给出同样的错误。
      • 点击此链接查看:stackoverflow.com/a/48264244/1364213
      • 好吧,我确实遵循了模式,但不幸的是它给出了相同的结果:(。我仍然坚持 - ImportError: numpy.core.multiarray failed to import after 我尝试运行最终输出。
      【解决方案3】:

      使用 opencv-python-headless 代替我解决了这个问题,正如 https://github.com/pyinstaller/pyinstaller/issues/3426 中提到的那样。

      卸载你的opencv库,然后

      pip install opencv-python-headless
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多