obj c странные предупреждения с PyQT5 в OSX после импорта cv2 - PullRequest
1 голос
/ 23 февраля 2020

Я получаю эти объективные c предупреждения в OSX после импорта cv2 (без предупреждений в противном случае) в каком-то простом GUI приложении, которое я создаю с помощью PyQt5. Вот минимальный пример (только предупреждения, без ошибок):

Версии:

  • PyQt5 5.10.1
  • PyQt5-sip 4.19.21
  • opencv- python 4.1.2.30

Код:

import sys
from PyQt5.QtWidgets import QWidget, QApplication, QDesktopWidget
import sqlite3
import cv2


class EmployeeBase(QWidget):
    def __init__(self, window_title, geometry):
        super().__init__()
        self.setGeometry(*geometry)
        self.setWindowTitle(window_title)
        win_rectangle = self.frameGeometry()
        center_point = QDesktopWidget().availableGeometry().center()
        win_rectangle.moveCenter(center_point)
        self.move(win_rectangle.topLeft())
        self.setStyleSheet('QPushButton:!hover {color: red}')
        self.show()


if __name__ == '__main__':
    connection = sqlite3.connect('Employees.db')
    cursor = connection.cursor()
    test = QApplication(sys.argv)
    window = EmployeeBase('Test', (0, 0, 500, 500))
    sys.exit(test.exec_())

Результат:

objc[1741]: Class QCocoaPageLayoutDelegate is implemented in both /Users/emadboctor/Library/Python/3.7/lib/python/site-packages/cv2/.dylibs/QtGui (0x110fee5c0) and /usr/local/lib/python3.7/site-packages/PyQt5/Qt/lib/QtPrintSupport.framework/Versions/5/QtPrintSupport (0x119519f20). One of the two will be used. Which one is undefined.
objc[1741]: Class QCocoaPrintPanelDelegate is implemented in both /Users/emadboctor/Library/Python/3.7/lib/python/site-packages/cv2/.dylibs/QtGui (0x110fee638) and /usr/local/lib/python3.7/site-packages/PyQt5/Qt/lib/QtPrintSupport.framework/Versions/5/QtPrintSupport (0x119519f70). One of the two will be used. Which one is undefined.
objc[1741]: Class QCocoaApplicationDelegate is implemented in both /Users/emadboctor/Library/Python/3.7/lib/python/site-packages/cv2/.dylibs/QtGui (0x110fee340) and /usr/local/lib/python3.7/site-packages/PyQt5/Qt/plugins/platforms/libqcocoa.dylib (0x1194b9480). One of the two will be used. Which one is undefined.
objc[1741]: Class QNSApplication is implemented in both /Users/emadboctor/Library/Python/3.7/lib/python/site-packages/cv2/.dylibs/QtGui (0x110fee2f0) and /usr/local/lib/python3.7/site-packages/PyQt5/Qt/plugins/platforms/libqcocoa.dylib (0x1194b94d0). One of the two will be used. Which one is undefined.
objc[1741]: Class QCocoaMenuLoader is implemented in both /Users/emadboctor/Library/Python/3.7/lib/python/site-packages/cv2/.dylibs/QtGui (0x110fee2a0) and /usr/local/lib/python3.7/site-packages/PyQt5/Qt/plugins/platforms/libqcocoa.dylib (0x1194b9570). One of the two will be used. Which one is undefined.
objc[1741]: Class QNSImageView is implemented in both /Users/emadboctor/Library/Python/3.7/lib/python/site-packages/cv2/.dylibs/QtGui (0x110fee660) and /usr/local/lib/python3.7/site-packages/PyQt5/Qt/plugins/platforms/libqcocoa.dylib (0x1194b9660). One of the two will be used. Which one is undefined.
objc[1741]: Class QNSStatusItem is implemented in both /Users/emadboctor/Library/Python/3.7/lib/python/site-packages/cv2/.dylibs/QtGui (0x110fee6b0) and /usr/local/lib/python3.7/site-packages/PyQt5/Qt/plugins/platforms/libqcocoa.dylib (0x1194b96b0). One of the two will be used. Which one is undefined.
objc[1741]: Class QNSOpenSavePanelDelegate is implemented in both /Users/emadboctor/Library/Python/3.7/lib/python/site-packages/cv2/.dylibs/QtGui (0x110fee480) and /usr/local/lib/python3.7/site-packages/PyQt5/Qt/plugins/platforms/libqcocoa.dylib (0x1194b9750). One of the two will be used. Which one is undefined.

1 Ответ

2 голосов
/ 24 февраля 2020

Способ реализации Qt и OpenCV для работы на Python - через механизм привязки, в котором элементы в общей собственной библиотеке (в обоих случаях запрограммированной на C ++) можно вызывать из интерпретатора Python. Это может быть достигнуто несколькими способами, такими как модуль ctypes стандартной библиотеки Python.

Проблема заключается в том, что две общие библиотеки предоставляют одинаковые символы. OpenCV может использовать Qt в качестве движка для создания GUI (он может использовать и другие, но версия, которую вы используете, скомпилирована для включения символов Qt). Когда интерпретатор загружает две общие библиотеки (в данном случае /Users/emadboctor/Library/Python/3.7/lib/python/site-packages/cv2/.dylibs/QtGui и /usr/local/lib/python3.7/site-packages/PyQt5/Qt/lib/QtPrintSupport.framework), он выдает предупреждение, поскольку механизм загрузки обнаружил один и тот же символ в разных местах. Предупреждение One of the two will be used. Which one is undefined. означает, что оно может принимать одно или другое, но нет предопределенного порядка или каких-либо предпочтений. Это проблема, если вы ожидаете определенного поведения, которое реализовано только в одном из двух (скажем, версия библиотеки cv2 для Qt - это версия 5.1, а версия PyQt - 5.2, и определенная функция doSomething была изменена с от версии к другой. Последовательность загрузки будет определять поведение вашей программы непредсказуемым образом.)

В общем, поскольку вы находитесь на ранних этапах разработки, а Qt - довольно стабильная библиотека, вам следует будь умницей. В случае, если вы столкнулись с вышеупомянутой проблемой, вы можете попробовать разные вещи, например, перекомпилировать OpenCV, чтобы использовать ожидаемую версию Qt (или сделать то же самое для PyQt). Я также рекомендую вам начать использовать виртуальные среды, поскольку тогда вы также сможете решить эту проблему, установив разные версии зависимостей для разных проектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...