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 :

Créer un exécutable (.exe) à partir d'un script python faisant appel à des sources externes (.txt)


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Non-informaticien
    Inscrit en
    Août 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non-informaticien

    Informations forums :
    Inscription : Août 2013
    Messages : 37
    Points : 17
    Points
    17
    Par défaut Créer un exécutable (.exe) à partir d'un script python faisant appel à des sources externes (.txt)
    Bonjour,

    Le sujet que j’aborde fait probablement très noob, mais, malgré plusieurs essais, je dois bien avouer que j’ai besoin d’une aide : ).

    J’ai créé, avec Python 3.4.1, une application, sous la forme d’un code assez long (plusieurs milliers de lignes, en plusieurs classes et de nombreuses fonctions). Ce code se fait avec importation des modules numpy, tkinter, marshal, random, time, urllib.request, os et operator. Il fonctionne également avec l’importation du contenu de plusieurs fichiers textes.

    Je cherche à transformer en application exécutable même sans installer python (standalone), et j’ai essayé de faire mes propres recherches. J’ai notamment trouvé le module py2exe. J’ai suivi les tutoriels (en anglais, langue que je suis normalement censé comprendre).

    Comme celui-ci :


    Mais j’ai une difficulté à appliquer la même démarche. Je précise que j’ai chargé la dernière version de py2exe, celle de mai 2015 (0.9.2.0).

    J’obtiens des messages d’erreurs tels que :

    Nom : Capture d'écran erreur 30 12 2015.png
Affichages : 16140
Taille : 26,4 Ko

    Le problème vient de l’existence de caractères spéciaux tels que « é », « è »…J’ai essayé de les supprimer dans les noms des variables de mon programme, même dans les chemins des répertoires…Mais apparemment, même les libellés de fenêtres (qui devraient avoir un langage naturel, donc avec des accents si besoin) posent problème.

    Y a-t-il un moyen pour que py2exe ne s’offusque plus de ces caractères spéciaux ? Faut-il tous les supprimer ?

    J’ai une autre question : mon but étant de faire une application standalone, et mon programme ne pouvant fonctionner qu’en important le contenu de fichiers textes dont je précise le chemin (sur un de mes disques, forcément), comment une version finale de l’application traiterait ces fichiers externes ? Je me doute que les chemins n’auraient plus aucune validité sur un autre PC. Les fichiers textes sont-ils enregistrés ou à enregistrer sous un nom/chemin spécial, et le code final (le fichier .py que je veux transformer en .exe) doit-il faire référence à ces fichiers textes d’une manière particulière ?

    N’hésitez pas à me dire si je ne suis pas clair.

    En tout cas, merci de votre attention et bonne année 2016.

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Je fais couramment des exe de codes Python, et ça marche bien, même avec des caractères accentués. Ceci avec de nombreux programmes complexes, y compris de plus de 30.000 lignes avec PyQt. Avec Python 3 qui travaille en unicode, on peut réaliser facilement des programmes en chinois ou en indou si nécessaire.

    Un petit bémol cependant: py2exe n'existe que sous Python 2. Alors, je suppose que tu as pris le py2exe sous Python 3.4 qui se trouve ici: http://www.py2exe.org/. Cette source de programme est bien pratique mais n'est pas garantie. Ça marche souvent très bien et quelquefois mieux que la source officielle, mais quelquefois moins bien.

    Moi j'utilise cx_freeze, et non py2exe, parce que cx_freeze fonctionne aussi sous Linux et sous OS X. Cependant, leur fonctionnement semble similaire.

    Mais il vaut mieux éviter d'utiliser des noms de variables avec des accents, même si c'est accepté par l'interpréteur. Les traitements de type py2exe ou cx_freeze sont très complexes, il vaut mieux les aider que de leur mettre des bâtons dans les roues... En dehors de ça, la présence d'accents dans les titres des widgets graphiques ou dans les données à traiter sont tout à fait normaux.

    La conclusion est qu'il y a un truc qui n'est pas correct dans ton code, mais je ne peux pas dire lequel puisque tu n'en donnes pas.

    Je te suggère la méthode suivante: commence par un tout petit code, genre print("abcéèàùôï"), et fait le traitement par py2exe. Si ça marche, complexifie-le jusqu'à retrouver le problème actuel. Et, avec ce petit code simple, quand ça ne marche pas, affiche-le ici (complètement, avec le shebang ainsi que le setup de traitement!) pour qu'on trouve l'erreur.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre à l'essai
    Homme Profil pro
    Non-informaticien
    Inscrit en
    Août 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non-informaticien

    Informations forums :
    Inscription : Août 2013
    Messages : 37
    Points : 17
    Points
    17
    Par défaut
    Bonjour tyrtamos,

    et bonne année au passage.

    merci de ta réponse, navré de ne pas t'avoir répondu plus tôt.

    Je vais tester cette démarche et reviendrai vers le forum ensuite.

    Pour l'instant, la ligne qui déclenche l'erreur notée dans la pièce jointe que j'ai mise dans mon message est la dernière de cet extrait :

    class WidgetParametres(object):
    def __init__(self):
    global ListeParametres
    self.root = tk.Tk()
    self.root.title("Changer les valeurs des paramètres")

    Apparemment, et d'après les autres erreurs que j'ai eues à traiter, c'est bien cet accent sur "paramètres" qui engendre l'erreur.

    Cordialement.

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour et meilleurs vœux à toi aussi!

    En principe, avec Python 3, le texte "codé en dur" dans la page de code est en unicode, et je pense que c'est ça qu'il faut à tkinter.

    Mais, car il y a un "mais", l'éditeur de texte utilisé a écrit le texte et l'a enregistré avec un autre encodage (utf-8? cp1252?, latin1?, ...). Il faut donc en informer Python pour qu'il puisse convertir correctement le texte en unicode à partir d'un encodage connu.

    On fait ça avec une simple ligne placée tout en haut de la page de code (exemple pour un code enregistré avec l'encodage "latin1"):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # -*- coding: latin1 -*-
    Pour Python 3, je crois que l'utf-8 pour la page de code est par défaut.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par tyrtamos Voir le message
    En principe, avec Python 3, le texte "codé en dur" dans la page de code est en unicode, et je pense que c'est ça qu'il faut à tkinter.

    Mais, car il y a un "mais", l'éditeur de texte utilisé a écrit le texte et l'a enregistré avec un autre encodage (utf-8? cp1252?, latin1?, ...). Il faut donc en informer Python pour qu'il puisse convertir correctement le texte en unicode à partir d'un encodage connu.
    C'est une théorie cohérente mais le problème devrait être aussi visible au lancement du code à la console.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre à l'essai
    Homme Profil pro
    Non-informaticien
    Inscrit en
    Août 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non-informaticien

    Informations forums :
    Inscription : Août 2013
    Messages : 37
    Points : 17
    Points
    17
    Par défaut
    Bonsoir,

    j'ai modifié l'encodage, et apparemment tout fonctionne avec # -*- coding: cp1252 -*- .

    J'obtiens le résultat suivant :
    Nom : Résultat création exe 4 01 2015.png
Affichages : 14630
Taille : 50,7 Ko

    Par contre, quand je lance le .exe présent dans le dossier dist qui vient d'être créé, j'obtiens le résultat suivant :
    Nom : Erreur exe 4 1 2016.png
Affichages : 14893
Taille : 160,6 Ko

    Dans le script, la ligne en question est :

    diconatures=marshal.load(open("N:\Invention\Invention 2012\Python\Entrees\listenatures.txt", "rb"))

    C'est un problème que j'ai fréquemment rencontré sur Python, et auquel je me suis adapté au cas par cas, en doublant les "\". Or, ici le programme se trompe car il prétend ne pas trouver un fichier dont le chemin est écrit avec des "\\", alors qu'il est écrit avec des "\" dans le script, tel que je vous l'ai écrit ci-haut.

    Connaissez-vous ce problème ?

    Merci d'avance.

  7. #7
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Éviter les caractères spéciaux et les espaces dans les noms de dossiers !
    Pas d'aide par mp.

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par Termirtau Voir le message
    Connaissez-vous ce problème ?
    Je ne sais vraiment pas pourquoi Python aurait bien compris une ligne de code manifestement erronée!

    Voilà 2 façons d'écrire cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # avec un 'r' devant le 1er guillemet:
    diconatures=marshal.load(open(r"N:\Invention\Invention 2012\Python\Entrees\listenatures.txt", "rb"))
     
    # ou en doublant les backslash:
    diconatures=marshal.load(open("N:\\Invention\\Invention 2012\\Python\\Entrees\\listenatures.txt", "rb"))
    Avec Windows, les espaces ou les caractères accentués dans les noms de chemin passent très bien.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  9. #9
    Membre à l'essai
    Homme Profil pro
    Non-informaticien
    Inscrit en
    Août 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non-informaticien

    Informations forums :
    Inscription : Août 2013
    Messages : 37
    Points : 17
    Points
    17
    Par défaut
    Bonsoir (ou bonjour),

    le code "fonctionne" maintenant, au sens où l'application se crée, et que lorsque que le .exe est lancé, il n'y a plus de message d'erreur.

    Le problème est qu'il n'y a rien après non plus (la fenêtre de l'application se ferme). Normalement, le code s'achève par l'apparition d'une fenêtre Tkinter. Cela fonctionne sans problème lorsque je copie les lignes sur un compilateur python.

    Le script se compose de classes, et la dernière ligne appelle l'une d'entre elles :

    app = Texte_IHM(listalveole, listalveolered, alphabet, listh)

    Y a-t-il un problème avec ma syntaxe, ou un moyen de vérifier si les classes créées ont été correctement interprétées?

    Merci d'avance, encore, de votre aide.

  10. #10
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Comme je n'utilise pas tkinter (ni py2exe d'ailleurs), j'ai bien peur de ne pas pouvoir t'aider sur ce coup -là.

    Cependant, une petite question: ce code que tu cherches à passer en exe, fonctionne-t-il correctement lors de son exécution normale en .py?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  11. #11
    Membre à l'essai
    Homme Profil pro
    Non-informaticien
    Inscrit en
    Août 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non-informaticien

    Informations forums :
    Inscription : Août 2013
    Messages : 37
    Points : 17
    Points
    17
    Par défaut
    Bonsoir,

    maintenant tout fonctionne.

    J'ai trouvé les solutions en m'inspirant de ce court code :
    https://bitbucket.org/anthony_tuinin...e-view-default

    D'abord j'ai utilisé la même syntaxe d'import de Tkinter que dans l'exemple...

    ...et surtout, j'ai utilisé (self.)root.mainloop(). Et ouais, sur mon compilateur, ça marchait sans.

    Maintenant, j'ai créé l'exécutable avec py2exe, et tout fonctionne a priori. Il faudra que je teste encore mon appli, et je reviens s'il y a souci.

    En attendant, merci à tous vos réponses !

Discussions similaires

  1. Réponses: 7
    Dernier message: 18/04/2012, 23h09
  2. Exécuter un .exe avec des paramètres à partir d'un script python
    Par soufianesse dans le forum Général Python
    Réponses: 3
    Dernier message: 06/10/2011, 14h59
  3. [E-03] Lancer un exécutable (.exe) à partir de VBA
    Par flatalex dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/12/2008, 22h13
  4. Comment exécuter .cshrc à partir d'un script sh lancé par crontab
    Par kenavoparis dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 23/08/2007, 13h53
  5. creer un script.exe à partir d'un script perl
    Par Lady_jade dans le forum Langage
    Réponses: 4
    Dernier message: 22/05/2007, 18h33

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