IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Pyinstaller exécutable seul avec fichier image


Sujet :

Python

Vue hybride

Aelurus_ Pyinstaller exécutable seul... 20/06/2020, 20h08
Aelurus_ avec un petit exemple ... 20/06/2020, 20h56
Aelurus_ Bon ... une histoire de... 20/06/2020, 22h08
tyrtamos Bonjour, pyinstaller avec... 21/06/2020, 05h25
Aelurus_ Effectivement tyrtamos, ma... 21/06/2020, 15h01
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Curieux
    Inscrit en
    Avril 2020
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2020
    Messages : 114
    Par défaut Pyinstaller exécutable seul avec fichier image
    Bonjour à tous,

    je bloque sur une déclaration dans le lancement de pyinstaller. Je souhaite faire un exécutable stand alone, et j'utilise un logo que j'insère dans un fichier .py.
    J'utilise cette commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pyinstaller -F --onefile ^
    --add-data=".\Logo.jpg;img" ^
    PostTraitementHelice.py
    pause
    Aucune erreur n'est retournée, le fichier exe est bien généré, mais si je ne mets pas le logo dans le dossier du .exe j'obtiens un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OSError: Cannot open resource "Logo.jpg"
    Je trouve rien de de spécial dans la doc pour intégrer un fichier image autre que --add-data. Dois-je faire quelque chose directement dans un fichier .py ?
    Si l'un de vous connais la manip ou voit mon erreur.
    Merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Curieux
    Inscrit en
    Avril 2020
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2020
    Messages : 114
    Par défaut
    avec un petit exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from PIL import Image, ImageTk 
    import  tkinter as Tk 
    root = Tk.Tk() 
     
    image = Image.open("Logo.png") 
    photo = ImageTk.PhotoImage(image) 
     
    canvas = Tk.Canvas(root, width = image.size[0], height = image.size[1]) 
    canvas.create_image(0,0, anchor = Tk.NW, image=photo)
    canvas.pack() 
    root.mainloop()
    et la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pyinstaller -F --onefile ^
    	--add-data "Logo.png";"." ^
    	test.py
    pause
    le code crée bien une fenêtre avec le logo mais rien avec l'exe qui est générer sans erreur...

  3. #3
    Membre confirmé
    Homme Profil pro
    Curieux
    Inscrit en
    Avril 2020
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2020
    Messages : 114
    Par défaut
    Bon ... une histoire de chemin relatif et absolu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from PIL import Image, ImageTk 
     
    import  tkinter as Tk 
     
    root = Tk.Tk() 
     
    image = Image.open("C:\\...\\...\\Logo.png") #ici le chemin absolu avec échappement des \, le chemin relatif fonctionnera au lancement du script mais pas de la compilation.
     
    photo = ImageTk.PhotoImage(image) 
    canvas = Tk.Canvas(root, width = image.size[0], height = image.size[1]) 
    canvas.create_image(0,0, anchor = Tk.NW, image=photo)
    canvas.pack() 
     
    root.mainloop()
    Si ça peut aider.

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    pyinstaller avec l'option "onefile" est bien pratique pour diffuser un fichier exécutable unique, mais a un fonctionnement particulier: il se comporte comme une archive exécutable. Ainsi, à l'exécution, il commence par se désarchiver dans un répertoire temporaire, et c'est là qu'il s'exécute comme n'importe quel programme Python.

    De ce fait, si l'exécution doit accéder à un fichier comme une image, il faut recalculer le vrai répertoire d'accès: celui du répertoire temporaire!

    La doc est ici: https://pyinstaller.readthedocs.io/e...formation.html

    Voilà comment on peut faire en sorte qu'un programme fonctionne en même temps de façon normale (.py) et après traitement par pyinstaller (.exe). Il faut ajouter au code du programme le calcul du répertoire d'exécution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):    
            repertexec = sys._MEIPASS # programma traité par pyinstaller
        else:
            repertexec = os.path.dirname(os.path.abspath(__file__)) # non traité
    Après traitement par pyinstaller, le répertoire d'exécution sera par exemple: "C:\Users\utilisateur\AppData\Local\Temp\_MEI41802"
    Attention: le répertoire temporaire "_MEI41802" n'existe que pendant l'exécution et sera détruit après.

    En admettant que le fichier image soit à la racine du programme, son adresse réelle sera dans tous les cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    image = os.path.join(repertexec, "monfichier.jpg")

  5. #5
    Membre confirmé
    Homme Profil pro
    Curieux
    Inscrit en
    Avril 2020
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2020
    Messages : 114
    Par défaut
    Effectivement tyrtamos,

    ma solution n'est pas fonctionnelle, je vais creuser avec le lien que tu as donné puis regarder le code que tu donnes pour le comprendre un minimum.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 18/06/2020, 08h54
  2. Exécuter Webscript avec fichier xml en paramètre
    Par viscere dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 29/09/2010, 11h16
  3. Réponses: 26
    Dernier message: 29/06/2010, 16h35
  4. [Exécution] Lancement logiciel avec fichier configuration
    Par Myogtha dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 26/01/2006, 13h58
  5. [VBA][Excel]Exécution macro avec fichiers source
    Par ouezon dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/12/2005, 00h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo