2 votes

Pyinstaller : Les images ne s'extraient pas

Je lance la commande de construction et tout semble se construire correctement jusqu'à ce que j'essaie de lancer l'exe et que ce message apparaisse :

Image

Voici mon fichier de spécifications, je ne sais pas pourquoi il semble combiner le chemin du fichier avec les deux images.

block_cipher = None

a = Analysis(['TripCalc.py'],
         pathex=['C:\\Users\\test\\Downloads\\TripApp'],
         binaries=[],
         datas=[('C:\\Users\\test\\Downloads\\TripApp\\BennySM.ico', 'C:\\Users\\test\\Downloads\\TripApp\\BgSM.gif')],
         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='TripCalc',
      debug=False,
      strip=False,
      upx=True,
      console=False , 
icon='C:\\Users\\test\\Downloads\\TripApp\\Benny.ico')

J'ai essayé d'ajouter les fichiers à côté des données :

('Benny.ico', 'C:\\Users\\test\\Downloads\\TripApp\\BennySM.ico', 'data', 'BgSM.gif', 'C:\\Users\\test\\Downloads\\TripApp\\BgSM.gif', 'data')

Mais il n'a pas voulu construire avec le ValueError: too many values to unpack (expected 2) .

J'ai suivi l'exemple de ce post sur la façon d'ajouter le chemin du fichier au fichier python principal. Regroupement des fichiers de données avec PyInstaller --onefile

Je suis capable de construire l'exe et de l'exécuter avec les images commentées. Toute aide serait la bienvenue.

Lorsque j'obtiens le message d'erreur de valeur, je configure le fichier spec avec ce qui suit :

block_cipher = None

a = Analysis(['TripCalc.py'],
         pathex=['C:\\Users\\test\\Downloads\\TripApp'],
         binaries=[],
         datas=[('Benny.ico','C:\\Users\\test\\Downloads\\TripApp\\BennySM.ico','data','BgSM.gif','C:\\Users\\test\\Downloads\\TripApp\\BgSM.gif','data')],
         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='TripCalc',
      debug=False,
      strip=False,
      upx=True,
      console=False , 
icon='C:\\Users\\test\\Downloads\\TripApp\\Benny.ico')

Fenêtre d'erreur

Build -Value Error

Avec ces changements dans le fichier spec, tout se construit sauf le fichier échec du lancement de script pops lors du lancement de l'exe. S'ils ont été emballés avec l'exe, ils devraient se trouver dans le fichier temporaire des données de l'application, n'est-ce pas ?

Gracias.

2voto

Stephen Rauch Points 29619

De la ( DOCS ) :

Ajout de fichiers de données :

Pour que les fichiers de données soient inclus dans le paquet, fournissez une liste décrivant les fichiers en tant que valeur de l'attribut datas= argument pour Analysis . La liste des fichiers de données est une liste de tuples . Chaque tuple a deux qui doivent toutes deux être des chaînes de caractères :

La première chaîne indique le ou les fichiers tels qu'ils se trouvent actuellement dans ce système. La seconde spécifie le nom du dossier qui contiendra les fichiers au moment de l'exécution.

Donc votre datas devra être quelque chose comme :

datas=[
    ('C:\\Users\\test\\Downloads\\TripApp\\BennySM.ico', 'data'),
    ('C:\\Users\\test\\Downloads\\TripApp\\BgSM.gif', 'data'),
],

1voto

slightlynybbled Points 948

Afin de contourner ce problème pour mes propres paquets - que j'essaie de rendre installables par pip - j'ai créé un paquet que j'appelle stringify . Le readme présente le cas d'utilisation principal.

L'idée de stringify est que vous construisez vos images (et d'autres types de fichiers également) en .py qui seront reconnus nativement par PyInstaller, ne nécessitant aucune _MEIPASS o if sys.frozen vaudou. Vos fichiers de spécifications deviennent plus portables et ont plus de chances de fonctionner dès le départ.

De plus, si vous empaquetez vos fichiers pour les distribuer sur pypi, quelqu'un utilise vos images dans son paquet, ils il n'est pas nécessaire de manipuler les fichiers de spécification.... cela fonctionne tout simplement !

Sur setup.py - ou quelque temps avant de distribuer votre paquet :

from stringify import stringify_py

stringify_py('images', 'my_package/images.py')

Vous pouvez ensuite importer vos images et remplacer vos appels à tkinter.PhotoImage comme ça :

from images import img

# tkinter.PhotoImage(file='/path/to/img.png')  # <- your original call
tkinter.PhotoImage(data=img)  # <- new call

Pour un exemple de cette méthode, vous pouvez vous référer à mes tk_tools paquet. Jetez un coup d'œil à setup.py et en tk_tools/visual.py . Notez que les images sont également stockées dans tk_tools/images.py qui est importé et utilisé directement. PyInstaller les récupérera directement avec le fichier de spécification 'standard', réduisant ainsi votre charge de travail lors de la construction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X