web-dev-qa-db-fra.com

Cette application n'a pas pu démarrer car elle n'a pas pu trouver ou charger le plug-in de la plateforme Qt "cacao".

Je pense avoir fait tout ce que j'ai pu au cours des 20 dernières heures, mais rien ne semble fonctionner. Mon application est en cours d'exécution et fonctionne - comme il se doit - le seul problème que j'ai est que je ne peux pas créer un ensemble .app à partir d'elle J'ai essayé à la fois Py2App et cx_Freeze mais aucun d'eux ne fonctionne. En raison du support multi-plateforme, je resterais avec ce dernier - si possible.

Le setup.py ressemble à ceci:

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)

Le message d'erreur que j'ai est le suivant:

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's 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

Mon système d'information:

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 structure:

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

La question est je pense assez évident: qu'est-ce que je fais mal? (ou qu'est-ce que je ne fais pas?)

37
Peter Varo

Lors de la création d'une application avec cx_Freeze sur MacOSX, toutes les bibliothèques dépendantes (fichiers .so sur MacOSX) sont regroupées dans le groupe d'applications. C’est ce qui rend l’application portable sur d’autres systèmes, sans nécessiter une seconde installation de Qt.

Lors du lancement de l'application, les bibliothèques doivent donc être chargées à partir de l'ensemble. Cependant, dans votre cas, les bibliothèques système sont toujours en cours de chargement: 

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

Le résultat One of the two will be used. Which one is undefined. signifie que l'un ou l'autre peut être chargé. S'il choisit le bon, c'est parfait! Si ce n'est pas le cas, vous devez charger simultanément deux ensembles de bibliothèques distincts, qui échouent peu de temps après. En passant, vous constaterez peut-être que si vous essayez votre application sur un autre système, cela fonctionnera correctement! Parfois.

Pour un aperçu du problème, je suggère de jeter un coup d’œil sur le bug n ° 33 suivant. 

Avant que tu commences

Assurez-vous que vous avez une version à jour de cx_Freeze installée. Je suggérerais d'essayer de cloner le référentiel et d'installer à partir de là.

Deuxièmement, assurez-vous que les plug-ins Qt sont correctement intégrés à votre application. Cx_Freeze avait précédemment recherché le fichier qt-menu.nib pour déterminer s’il était en train de créer une application Qt. Ce n'est plus disponible dans Qt5, mais vous pouvez le transmettre en ligne de commande lors de la création de votre application. Réglez-le à votre guise, peu importe:

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

Cela peut suffire à résoudre votre problème. Mais sinon, vous avez deux options:

Option 1

Chaque fichier de bibliothèque contient les chemins d'accès à ses dépendances. Si vous recevez cette erreur, cela signifie que certains de ces chemins sont a) pointant toujours vers le fichier d'origine ou b) pas suffisamment spécifiques (et se trouvant sur votre PATH ou DYLD_LIBRARY_PATH). Cependant, vous pouvez réécrire les chemins en utilisant install_name_tool à partir de la ligne de commande (comme décrit ici :

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

Cela réécrit les chemins dans les bibliothèques pour qu'ils pointent dans votre dossier d'application, en utilisant @executable_path comme base. Vous devrez le faire pour tous les chemins que vous trouvez en train de se charger de manière incorrecte. Je suggérerais de le résumer dans un script pour qu'il s'exécute automatiquement après la construction.

Si vous voulez voir à quelles bibliothèques un fichier fait référence, vous pouvez utiliser otool. Par exemple, dans une application construite avec succès:

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) 
...

Il y a eu un solution de contournement mise à jour dans le suivi des problèmes qui suggère que le simple fait d'importer le bon module dans votre application le fera fonctionner, mais il semble peu probable que vous ayez effectué une application sans QtWidgets.

Option 2

Si ce qui précède ne fonctionne pas, une autre approche est décrite ici . Ceci est un peu une approche de sledgehammer dans la mesure où cela empêche simplement le chargement de plugins.

  • Ajoutez un fichier qt.conf à côté de l'exécutable (dans le paquet .app qui contient:
    [Paths] Plugins = '.'

  • Définissez la variable d'environnement QT_PLUGIN_PATH="" (vous pouvez le faire dans votre application avant d'importer PyQt. Ou appelez QtGui.QApplication.setLibraryPaths([]) avant de créer votre objet d'application.

Le résultat n'est pas de plug-ins, votre application n'aura donc pas accès au style et à l'interface utilisateur MacOSX Cocoa (par exemple, les dialogues de fichiers, de couleurs).

6
mfitzp

Cela s'ajoute à la réponse de @ mfitzp.

Ce QT Plugins Document s'est avéré utile.

Pour rechercher les emplacements par défaut que votre application QT tente de rechercher, vous pouvez utiliser la commande suivante:

$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

Vous pouvez voir cette application QT essayer de regarder dans MacOS/platforms; une fois que j'ai copié mon plugin libqcocoa.dylib (son chemin a été modifié par la commande install_name_tool conformément à la réponse de @ mfitzp), mon application a fonctionné à merveille.

BTW il est conseillé par guide de codage MAC pour que cette structure de répertoires soit correctement configurée, 

NE PAS mettre Frameworks, plugins dans le répertoire ncher.app/Contents/MacOS

2
PnotNP

J'ai eu ce problème dans le contexte du démarrage d'une application Qt Widgets à partir de Qt Creator.

Ce qui m'a aidé a été de définir la variable QT_PLUGIN_PATH sur la valeur <Qt-dir>/plugins (où <Qt-dir> est le chemin absolu du dossier du répertoire Qt contenant, entre autres, bin, doc, include, lib et bien sûr plugins).

Cela n'a probablement pas corrigé la cause première du problème, mais c'était une solution rapide qui fonctionnait bien jusqu'à présent.

0
rsp1984