2014-05-03 1 views
2

s'il vous plaît lire tout ce post et aidez-moi. Je veux créer --onefile exécutable avec pyinstaller.Bundle (Just --onefile)

j'ai ces derniers dans le développement côté:

  • fenêtres 8.1 x64
  • Qt 5.2.1
  • Python 27
  • PyQt5.2.1 (qui a construit avec Visual Studio 2012)
  • visuelle Studio 2012
  • PyInstaller 2.1
  • pyWin32

et ceux-ci dans le côté de déploiement (VirtualBox) (comme une machine virtuelle propre):

  • Windows 8 x64
  • vcredist_x64 2012

ce qui est mon programme simple python que je veux pour construire:

#main.py 
import sys 
from PyQt5.QtWidgets import QApplication, QPushButton 

app = QApplication(sys.argv) 

win = QPushButton("Hello World!") 
win.show() 

sys.exit(app.exec_()) 
#------------------------------------------------ 

ok, quand je le construis comme --onedir (pyinstaller main.py) il fonctionne très bien du côté du développement et du déploiement.

lorsque je le construis comme --onefile (pyinstaller -F main.py) cela fonctionne très bien du côté du développement mais cela ne fonctionne pas du côté du déploiement.

et donner cette erreur:

This application failed to start because it could not find or load the Qt platform plugin "windows".

Available platform plugins are: minimal, offscreen, windows.

Reinstalling the application may fix this problem.

ce qui est de ma faute ou quel est le problème de ce bâtiment? En termes de cette erreur, il ne peut pas trouver le dossier qt5_plugins qui se trouve dans le dossier _MEIxxxxx dans le dossier temporaire.

Ou, pensez-vous que le problème vient du module sys? Si oui, que dois-je faire?

merci pour la réponse à l'avance

Mise à jour:

je dois dire que j'ai ce warnnings et Erro en construction temps:

1024 WARNING: No such file C:\Python27\msvcp90.dll 1024 WARNING: Assembly incomplete 1026 ERROR: Assembly amd64_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_none not found

Update2:

j'ai ajouté msvcp90.dll, msvcm90.dll à c:\Python27 manuellement, et ces avertissements et erreurs sont résolus.

Mise à jour 3:

qt.conf:

[Paths] 
Plugins = qt5_plugins 

main.spec:

# -*- mode: python -*- 
a = Analysis(['main.py'], 
      pathex=['D:\\hello2'], 
      hiddenimports=['sip', "PyQt5.QtCore", "PyQt5.QtGui", "PyQt5.QtWidgets"], 
      hookspath=None, 
      runtime_hooks=None) 
pyz = PYZ(a.pure) 
plugins = [("qt5_plugins/platforms/qwindows.dll", 
      "C:\\Qt\\Qt5.2.1\\5.2.1\\msvc2012_64\\plugins\\platforms\\qwindows.dll", "BINARY")] 
data = [ 
    ("qt.conf", "qt.conf", "DATA") 
] 
exe = EXE(
    pyz, 
    a.scripts, 
    a.binaries + plugins, 
    a.zipfiles, 
    a.datas + data, 
    name='main.exe', 
    debug=False, 
    strip=None, 
    upx=True, 
    console=True 
) 

qt5_plugins qui a créé automatiquement avec pyinstaller ont la plate-forme plugin.and je ne sais pas Je pense qu'il faut ajouter manuellement comme extralib.

Répondre

0

Est-ce que cela pourrait être un doublon possible de someone elses attempts to build on OSX?

Chaque fois que j'ai utilisé pyinstaller pour construire PyQt4 sous Linux, je n'ai jamais pu construire directement avec la commande pyinstaller et les drapeaux utilisant le fichier source python. J'ai d'abord dû générer le fichier spec et y apporter des modifications, puis construire en utilisant ce fichier spec modifié.

Il semble que vous ne récupériez pas les fichiers système Windows nécessaires, ainsi que les fichiers de plug-in, dans le cadre de votre processus de construction. Ceux-ci devront être ajoutés manuellement à votre fichier spec pour leur indiquer d'être collectés en tant que libs supplémentaires, avec un fichier qt.conf modifié qui définit l'emplacement des plugins comme étant relatif ([Paths]\nPlugins = qt5_plugins")

Je ne sais pas ont des fenêtres à portée de main pour vous montrer un fichier de spécification spécifique, mais voici quelque chose près comme un exemple sur mon mac:

a = Analysis(
    ['/path/to/my/script.py'], 
    # Path to extra pythonpath locations 
    pathex=['/path/to/my/script'], 
    # Extra imports that might not have been auto-detected 
    hiddenimports=["PySide", "PySide.QtCore", "PySide.QtGui"], 
    hookspath=None, 
    runtime_hooks=None 
) 

pyz = PYZ(a.pure) 

# Binary files you need to include in the form of: 
# (<destination>, <source>, "<TYPE>") 
plugins = [ 
    (
    "qt4_plugins/imageformats/libqjpeg.dylib", 
    "/usr/local/Cellar/qt/4.8.1/plugins/imageformats/libqjpeg.dylib", 
    "BINARY" 
), 
    (
    "qt4_plugins/phonon_backend/libphonon_qt7.dylib", 
    "/usr/local/Cellar/qt/4.8.1/plugins/phonon_backend/libphonon_qt7.dylib", 
    "BINARY" 
) 
] 

# Data files you want to include, in the form of: 
# (<destination>, <source>, "<TYPE>") 
data = [ 
    ("qt.conf", "qt.conf", "DATA") 
] 

exe = EXE(
    pyz, 
    a.scripts, 
    a.binaries + plugins, 
    a.zipfiles, 
    a.datas + data, 
    name='script', 
    debug=False, 
    strip=None, 
    upx=True, 
    console=False, 
    resources=['qt.conf'] 
) 

# This BUNDLE part is only relevant on a MAC 
app = BUNDLE(
    exe, 
    name='script', 
    icon=None 
) 

J'ai d'abord utiliser le utils/makespec.py pour générer un fichier de spécification « squelette » qui a des options initiales de la flags, puis modifiez-le. Ensuite, j'utilise pyinstaller sur le fichier de spécifications.

Vous pouvez également regarder ici pour d'autres références, bien qu'il soit encore OSX: https://github.com/hvdwolf/pyExifToolGUI/blob/master/MacOSX/pyexiftoolgui.spec

+0

Justin vous défini des données, mais pourquoi vous ne l'utilisez pas dans exe? – Madoodia

+0

@Madoodia - faute de frappe. Je viens de le réparer. – jdi

0

je pourrais trouver la réponse et le travail complet: il y avait une erreur qui causent problème dans la gestion exe vm propre:

  • utilisant if __name__ == "__main__":
  • ajouter notre répertoire pour PATH variable d'environnement
  • ajouter nos dossiers ou fichiers dont nous avons besoin manuellement

    par exemple:

    • nos fichiers .qml ou dossier d'images
    • répertoire
    • QML pour l'utilisation de fichiers QML et etc

ceci est échantillon:

principal.py

import sys 
import os 

from PyQt5.QtWidgets import QApplication, QPushButton 
# from PyQt4.QtGui import QPushButton, QApplication 

if getattr(sys, 'frozen', False): 
    FullDirectory = os.path.join(os.environ.get("_MEIPASS", sys._MEIPASS)) 
    os.environ['PATH'] = FullDirectory 
    # QApplication.addLibraryPath(FullDirectory) 
else: 
    FullDirectory = os.path.dirname(os.path.abspath(__file__)) 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    win = QPushButton("Hello World!") 
    win.show() 
    sys.exit(app.exec_()) 

et ce fichier est spec exemple:

main.spec

# -*- mode: python -*- 
import os 
import platform 
import sys 
sys.path.append("") 

a = Analysis(['main.py']) 
pyz = PYZ(a.pure) 
exename = 'main.exe' 
if "64" in platform.architecture()[0]: 
    exename = 'main_x64.exe' 

exe = EXE(
    pyz, 
    a.scripts, 
    a.binaries, 
    a.zipfiles, 
    a.datas, 
    name=os.path.join('dist', exename), 
    debug=False, 
    strip=None, 
    upx=True, 
    console=True 
) 

J'espère que cela sera helpfull pour vous.

merci à tous

0

L'erreur application failed to start because ... platform plugin "windows" peut aussi être due à la compression UPX.

Si vous utilisez PyInstaller et que vous avez configuré UPX pour la construction, vous devrez remplacer manuellement le qwindows.dll compressé par le compresseur non compressé.

La version non compressée peut être trouvée ici:

C:\Python34\Lib\site-packages\PyQt5\plugins\platforms\qwindows.dll

Collez le fichier ci-dessus dans le dossier temporaire de PyInstaller qui se trouve quelque part comme:

C:\Users\JohnSmith\AppData\Roaming\pyinstaller\bincache01_py34_64bit\qt5_plugins\platforms\

réexécutez Ensuite, votre PyInstaller commande

1

Je viens d'essayer d'utiliser pyinstaller pour le première fois et a reçu le message «windows» manquant. Après avoir regardé de nombreuses «solutions» et essayé toutes sortes de choses, j'ai finalement résolu le problème en mettant le qwindows.dll de C: \ Python34 \ Lib \ site-packages \ PyQt4 \ plugins \ platform dans le répertoire de l'application (dist) plus qt4_plugins \ plates-formes (J'ai créé manuellement le répertoire des plates-formes, pyinstaller a créé le répertoire qt4_plugins)

Pas aussi élégant que de créer un fichier qt.conf, mais il a fonctionné.

Je devrais ajouter que j'utilise Windows 7, python 3.4 et PyQt4.

Questions connexes