Подтвердить что ты не робот

Это приложение не удалось запустить, поскольку оно не могло найти или загрузить плагин платформы Qt "cocoa"

Думаю, я сделал все, что мог, за последние 20 часов, но ничего не работает. Мое приложение работает и работает - как и должно быть - единственная проблема, с которой я сталкиваюсь, заключается в том, что я не могу создать пакет .app. Я пробовал как Py2App, так и cx_Freeze, но не работает. Из-за многоплатформенной поддержки я бы придерживался последней - если возможно.

setup.py выглядит следующим образом:

import sys
from cx_Freeze import setup, Executable

base = None
if sys.platform == 'win32':
    base = 'Win32GUI'

OPTIONS = {'build_exe': {'includes': ['sip',
                                      'PyQt5',
                                      'PyQt5.QtCore',
                                      'PyQt5.QtGui',
                                      'PyQt5.QtWidgets',
                                      'PyQt5.QtMultimediaWidgets',
                                      'PyQt5.QtMultimedia',
                                      'PyQt5.QtNetwork']}}

EXECUTABLES = [Executable('main.py', base=base)]
NAME = 'coublet'
VERSION = '0.5.70'

setup(name = NAME,
      version = VERSION,
      options = OPTIONS,
      executables = EXECUTABLES)

Сообщение об ошибке, которое у меня есть, следующее:

objc[28404]: Class NotificationReceiver is implemented in both
/Users/.../build/coublet-0.5.70.app/Contents/MacOS/QtWidgets and
/usr/local/Cellar/qt5/5.3.1/lib/QtWidgets.framework/Versions/5/QtWidgets. One of
the two will be used. Which one is undefined.
QObject::moveToThread: Current thread (0x7fc4b96e98b0) is not the object thread
(0x7fc4b95dbc80).
Cannot move to target thread (0x7fc4b96e98b0)

On Mac OS X, you might be loading two sets of Qt binaries into the same process.
Check that all plugins are compiled against the right Qt binaries. Export
DYLD_PRINT_LIBRARIES=1 and check that only one set of binaries are being loaded.
This application failed to start because it could not find or load the Qt
platform plugin "cocoa".

Available platform plugins are: cocoa, minimal, offscreen.

Reinstalling the application may fix this problem.
Abort trap: 6

Моя системная информация:

Mac OS X  : 10.9.4
Python    :  3.4.1
cx_Freeze :  0.9
PyQt5:    :  5.3.1
- - -
Packages installed via: Homebrew and PIP

.app Структура:

build/coublet-0.5.70.app
└── Contents
    ├── Frameworks
    ├── Info.plist
    ├── MacOS
    │   ├── PyQt5.QtCore.so
    │   ├── PyQt5.QtGui.so
    │   ├── PyQt5.QtMultimedia.so
    │   ├── PyQt5.QtMultimediaWidgets.so
    │   ├── PyQt5.QtNetwork.so
    │   ├── PyQt5.QtWidgets.so
    │   ├── Python
    │   ├── QtCore
    │   ├── QtCore.so
    │   ├── QtGui
    │   ├── QtGui.so
    │   ├── QtMultimedia
    │   ├── QtMultimedia.so
    │   ├── QtMultimediaWidgets
    │   ├── QtMultimediaWidgets.so
    │   ├── QtNetwork
    │   ├── QtNetwork.so
    │   ├── QtOpenGL
    │   ├── QtWidgets
    │   ├── QtWidgets.so
    │   ├── _bisect.so
    │   ├── _bz2.so
    │   ├── _codecs_cn.so
    │   ├── _codecs_hk.so
    │   ├── _codecs_iso2022.so
    │   ├── _codecs_jp.so
    │   ├── _codecs_kr.so
    │   ├── _codecs_tw.so
    │   ├── _datetime.so
    │   ├── _hashlib.so
    │   ├── _heapq.so
    │   ├── _json.so
    │   ├── _lzma.so
    │   ├── _md5.so
    │   ├── _multibytecodec.so
    │   ├── _opcode.so
    │   ├── _pickle.so
    │   ├── _posixsubprocess.so
    │   ├── _random.so
    │   ├── _scproxy.so
    │   ├── _sha1.so
    │   ├── _sha256.so
    │   ├── _sha512.so
    │   ├── _socket.so
    │   ├── _ssl.so
    │   ├── _struct.so
    │   ├── array.so
    │   ├── binascii.so
    │   ├── grp.so
    │   ├── imageformats
    │   │   ├── libqdds.dylib
    │   │   ├── libqgif.dylib
    │   │   ├── libqicns.dylib
    │   │   ├── libqico.dylib
    │   │   ├── libqjp2.dylib
    │   │   ├── libqjpeg.dylib
    │   │   ├── libqmng.dylib
    │   │   ├── libqsvg.dylib
    │   │   ├── libqtga.dylib
    │   │   ├── libqtiff.dylib
    │   │   ├── libqwbmp.dylib
    │   │   └── libqwebp.dylib
    │   ├── libcrypto.1.0.0.dylib
    │   ├── liblzma.5.dylib
    │   ├── library.zip
    │   ├── libreadline.6.dylib
    │   ├── libssl.1.0.0.dylib
    │   ├── main
    │   ├── math.so
    │   ├── platforms
    │   │   ├── libqcocoa.dylib
    │   │   ├── libqminimal.dylib
    │   │   └── libqoffscreen.dylib
    │   ├── pyexpat.so
    │   ├── readline.so
    │   ├── select.so
    │   ├── sip.so
    │   ├── termios.so
    │   ├── time.so
    │   ├── unicodedata.so
    │   └── zlib.so
    └── Resources

Вопрос в том, что я считаю довольно очевидным: что я делаю неправильно? (или что я не делаю?)

4b9b3361

Ответ 1

При создании приложения с cx_Freeze в MacOSX все связанные библиотеки (.so файлы на MacOSX) упаковываются в пакет приложений. Именно это делает приложение переносимым для других систем, не требуя второй установки Qt.

При запуске приложения библиотеки должны быть загружены из комплекта. Однако в вашем случае все еще загружаются системные библиотеки:

/Users/.../build/coublet-0.5.70.app/Contents/MacOS/QtWidgets
/usr/local/Cellar/qt5/5.3.1/lib/QtWidgets.framework/Versions/5/QtWidgets

Результат One of the two will be used. Which one is undefined. означает, что любой из них может быть загружен. Если он выбирает правильный, отлично! Если это не так, у вас есть два отдельных набора загружаемых библиотек одновременно, и это происходит вскоре после этого. В стороне, вы можете обнаружить, что если вы попробуете приложение в другой системе, он будет работать нормально! Иногда.

Для обзора проблемы я предлагаю взглянуть на следующую ошибку # 33.

Прежде чем начать

Убедитесь, что у вас установлена ​​обновленная версия cx_Freeze. Я бы предложил попробовать клонировать хранилище и устанавливать оттуда.

Во-вторых, убедитесь, что плагины Qt правильно встроены в ваше приложение. Cx_Freeze ранее искал файл qt-menu.nib, чтобы определить, строит ли он приложение Qt. Это больше не доступно в Qt5, но вы можете передать его в командной строке при создании своего приложения. Установите его на все, что хотите, это действительно не имеет значения:

python setup.py bdist_mac --qt-menu-nib=/usr/local/Cellar/qt5/5.3.1/plugins/platforms/

Этого может быть достаточно, чтобы исправить вашу проблему. Но если нет, у вас есть два варианта:

Вариант 1

Каждый файл библиотеки содержит пути к его зависимостям. Если вы получаете эту ошибку, это означает, что некоторые из этих путей: либо) все еще указывают на исходный файл, либо b) недостаточно специфичны (и находятся на вашем PATH или DYLD_LIBRARY_PATH). Однако вы можете переписать пути с помощью install_name_tool из командной строки (как описано здесь:

install_name_tool -change /usr/local/Cellar/qt5/5.3.1/lib/QtWidgets.framework/Versions/5/QtWidgets @executable_path/QtWidgets build/MyApp.app/Contents/MacOS/qt_plugins/platforms/libqcocoa.dylib
install_name_tool -change /usr/local/Cellar/qt5/5.3.1/lib/QtCore.framework/Versions/5/QtCore @executable_path/QtCore build/MyApp.app/Contents/MacOS/qt_plugins/platforms/libqcocoa.dylib
install_name_tool -change /usr/local/Cellar/qt5/5.3.1/lib/QtPrintSupport.framework/Versions/5/QtPrintSupport @executable_path/QtPrintSupport build/MyApp.app/Contents/MacOS/qt_plugins/platforms/libqcocoa.dylib
install_name_tool -change /usr/local/Cellar/qt5/5.3.1/lib/QtGui.framework/Versions/5/QtGui @executable_path/QtGui build/MyApp.app/Contents/MacOS/qt_plugins/platforms/libqcocoa.dylib

Это перезаписывает пути в библиотеках, чтобы указать в вашу папку приложения, используя @executable_path в качестве базы. Вам нужно будет сделать это для всех путей, которые вы находите неправильно. Я бы предложил включить его в script для автоматического запуска после сборки.

Если вы хотите посмотреть, какие библиотеки ссылаются на файл, вы можете использовать otool. Например, в успешно выполненном моем приложении:

otool -L libqcocoa.dylib 
libqcocoa.dylib:
    @executable_path/../Resources/qt_plugins/platforms/libqcocoa.dylib (compatibility version 0.0.0, current version 0.0.0)
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 20.0.0) 
...

Был обнаружен обновленный обходной путь в журнале отслеживания проблем, который предполагает, что только импорт правильного модуля в ваше приложение заставит его функционировать, однако это кажется маловероятным, что вы сделали приложение без QtWidgets.

Вариант 2

Если вышеуказанное не работает, есть другой подход, описанный здесь. Это немного похоже на кувалду, поскольку он просто предотвращает загрузку плагинов вообще.

  • Добавьте файл qt.conf рядом с исполняемым файлом (в пакете .app, который содержит:
    [Paths] Plugins = '.'

  • Либо установите переменную окружения QT_PLUGIN_PATH="" (вы можете сделать это в своем приложении перед импортом PyQt) или вызвать QtGui.QApplication.setLibraryPaths([]) перед созданием вашего объекта приложения.

В результате нет плагинов, поэтому ваше приложение не будет иметь доступ к стилю MacOSX Cocoa и пользовательскому интерфейсу (например, файлу, цвету).

Ответ 2

Это в дополнение к ответу @mfitzp.

Этот Документ плагинов QT пригодится.

Для поиска местоположений по умолчанию, которые пытается выполнить поиск вашего QT-приложения, вы можете использовать следующую команду:

$sudo dtruss MacOS/ncher 
  getattrlist("/ncher.app\0", 0x7FFF954B51A4, 0x7FFF5C8FDD20)              = 0 0
  getattrlist("/ncher.app/Contents\0", 0x7FFF954B51A4, 0x7FFF5C8FDD20)             = 0 0
  getattrlist("/ncher.app/Contents/MacOS\0", 0x7FFF954B51A4, 0x7FFF5C8FDD20)               = 0 0
  stat64("/ncher.app/Contents/MacOS\0", 0x7FFF5C8FDED8, 0x7FFF5C8FDD20)            = 0 0
  stat64("/ncher.app/Contents/MacOS/platforms/.\0", 0x7FFF5C8FDF58, 0x7FFF5C8FDD20)                = -1 Err#2
  open("/dev/tty\0", 0x1000000, 0x1FF)             = 5 0
  fcntl(0x5, 0x2, 0x1)             = 0 0
  close(0x5)               = 0 0
  write_nocancel(0x2, "This application failed to start because it could not find or load the Qt platform plugin \"cocoa\".\n\nReinstalling the application may fix this problem.\n\0", 0x97)              = 151 0
  sigprocmask(0x3, 0x7FFF5C8FE6B4, 0x0)            = 0x0 0
  __pthread_sigmask(0x3, 0x7FFF5C8FE6C0, 0x0)              = 0 0
  __pthread_kill(0x603, 0x6, 0x0)          = 0 0
  kevent64(0x4, 0x0, 0x0)          = -1 Err#4

Вы можете увидеть это приложение QT, пытаясь заглянуть в MacOS/platforms, как только я скопировал свой плагин libqcocoa.dylib(его путь был изменен командой install_name_tool в соответствии с ответом @mfitzp), мое приложение работало как прелесть.

BTW рекомендуется руководство по кодам MAC-адресов, чтобы правильно настроить эту структуру каталогов,

DONT поставить Frameworks, плагины в ncher.app/Contents/MacOS каталог