web-dev-qa-db-fra.com

Pyinstaller et --onefile: Comment inclure une image dans le fichier exe

J'ai créé un fichier exe en utilisant Pyinstaller.

pyinstaller.exe --onefile --icon='Loco.ico program.py

Dans le programme, j'inclus une image dans mes graphiques et lorsque je lance le programme seul dans son dossier, j'obtiens les informations suivantes:

IOError: [Errno 2] No such file or directory: 'Logo.png'

Une solution consiste à inclure l'image dans le dossier de l'exe, comme indiqué dans le lien ci-dessous:

pyinstaller ne montre pas les images et l'icône

Mais là encore, l’intérêt de onefile est d’avoir exactement cela, pas besoin de l’image en plus. Je pense que la solution peut être dans ce lien, mais je ne l'ai pas compris.

Regroupement de fichiers de données avec PyInstaller (--onefile)

mon fichier de spécifications ressemble à ce qui suit:

# -*- mode: python -*-
a = Analysis(['AMOS_Visualizer.py'],
    pathex=['C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting'],
    hiddenimports=[],
    hookspath=None,
    runtime_hooks=None)

pyz = PYZ(a.pure)
exe = EXE(pyz,
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      name='AMOS_Visualizer.exe',
      debug=False,
      strip=None,
      upx=True,
      console=True , icon='AMOS.ico')
6
Nautilius

Modifier:

Je crois avoir trouvé la solution à mon problème.

# -*- mode: python -*-
a = Analysis(['AMOS_Visualizer.py'],
         pathex=['C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting'],
         hiddenimports=[],
         hookspath=None,
         runtime_hooks=None)

for d in a.datas:
    if 'pyconfig' in d[0]:
        a.datas.remove(d)
        break

a.datas += [('Logo.png','C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting\\Logo.png', 'Data')]
pyz = PYZ(a.pure)
exe = EXE(pyz,
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      name='AMOS_Visualizer.exe',
      debug=False,
      strip=None,
      upx=True,
      console=True, icon='C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting\\AMOS.ico')

Et en ajoutant ce qui suit à mon script main.py

def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    try:
        # PyInstaller creates a temp folder and stores path in _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)

Logo = resource_path("Logo.png")
10
Nautilius

Si vous utilisez Qt Designer, vous pouvez le faire en créant un fichier de ressources et en ajoutant toutes les images souhaitées, y compris le fichier Logo.png, à cette ressource.

Pour créer un fichier de ressources, suivez les étapes de Insertion d’une image dans l’interface graphique à l’aide de QT Designer .

Après avoir inséré les images dans le fichier de ressources, assignez le logo.png à l’icône Fenêtre, enregistrez l’interface QtDesigner et convertissez le fichier de ressources à l’aide de la commande suivante: pyrcc4 -py3 resourcetest.qrc -o resourcetest_rc.py

Enfin, utilisez l’option --onefile pour créer le fichier exe. Pas besoin de modifier le fichier de spécification.

1
Diego

Ajoutez "datas = ['Emplacement de votre fichier']" avant "hiddenimports = []". Ça fera. Dans mon cas cela a fonctionné

    # -*- mode: python -*-

block_cipher = None


a = Analysis(['embed.py'],
             pathex=['C:\\Users\\Aravind\\Desktop\\exe'],
             binaries=[],
             datas=['C:\\Users\\Aravind\\Desktop\\exe\\dist\\map.png'],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='embed',
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=True )
1
Aravind S

Ceci est une variante de ce qui suit: Regroupement de fichiers de données avec PyInstaller (--onefile) , et la réponse fournie est plus claire.

En 2 lignes:

  1. Vous devez ajouter vos fichiers image dans "datas" (soit dans vos fichiers spec, soit avec un script de hook PyInstaller)
  2. Utilisez le sys._MEIPASS s'il existe,
    utilisant la ligne unique base_path = getattr(sys, '_MEIPASS', '.')+'/' pour obtenir une variable "root_path" à concaténer à tous les chemins de vos fichiers.
    Alors, filepath = base_path + filepath
0
2diabolos.com