Problème avec pickle

Bonjour !

J'ai un problème avec le script en python que je vous joins au-dessous. J'utilise Visual Studio Code pour coder, et quand j'exécute ce code dans l'application, ça marche. Mais pas quand je l'ouvre seul... Je ne comprends pas.

J'ai identifié que le problème venait du module
pickle
(j'ai enlevé toutes ses apparitions et son importation et ça a marché).

J'ai au préalable exécuté la commande :
pip install pickle4

... on m'a dit que cela avait été exécuté avec succès. Seulement, ça ne marche pas quoi... ????

Est-ce que j'ai installé le mauvais module ? Ou je ne sais pas trop quoi ?
Merci d'avance à tous ceux qui pourraient éclairer ma lanterne !

????????????

7 réponses

  1. Contributeur
    bonjour,

    as-tu un message d'erreur quand cela ne marche pas? ce message a pour but d'aider à identifier de quelle erreur il s'agit.

    avant de l'ouvrir dans un autre environnement Python que VSCode, as-tu également importé le module dans cet autre environment?
    0
    1. Non je n'ai pas de message d'erreur, l'interface s'ouvre et se referme instantanément. Je ne connais pas trop en revanche le nom de l'autre environnement que j'utilise, c'est celui par défaut (quand on double-clique sur un fichier .py)
      0
      1. Bonjour,

        j'ai un problème avec le script en python que je vous joins au-dessous

        il est où ton code ???????

        Peux-tu l'afficher avec les balises Python ?

        Mode d'emploi : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

        ceci dit, moi, j'utilise pickle sans l'avoir jamais installé (pip install ....), il est de base dans l'environnement Python

        import pickle
        
        with open('pick.pkl','wb') as fo:
            pickle.dump(n, fo)
        
        etc ...
        0
        1. Le voilà, mon code, désolé
          ~(>_<。)\

          from operator import index
          import os
          import os.path
          from time import sleep
          import pickle
          import random
          
          choix_menu = ""
          mot_de_passe_entré = ""
          choix_jeu_élève = ""
          quit_élève = ""
          change_mot_de_passe_un = ""
          change_mot_de_passe_deux = ""
          mdp=""
          mots_prof = []
          mots_run = []
          mots_faux = []
          
          with open("mots.dat", "rb") as x:
              mots_prof = pickle.load(x)
          x.close()
          
          
          while 1==1 :
              choix_menu1 = False
              while choix_menu1 == False :
                  os.system ("cls")
                  print("\t\t\tMenu :\n")
                  print("Où voulez-vous vous rendre ?")
                  print("-Espace élève")
                  print("-Espace enseignant\n")
                  choix_menu = str(input("Espace : "))
                  if choix_menu == "élève" or choix_menu == "eleve" or choix_menu == "Elève" or choix_menu == "Eleve" or choix_menu == "ELEVE" :
                      os.system("cls")
                      print("\t\t\tEspace élève :\n")
                      print("Bienvenue dans l'espace élève.")
                      sleep(2)
                      choix_élève1 = False
                      while choix_élève1 == False :
                          os.system("cls")
                          print("\t\t\tEspace élève :\n")
                          choix_jeu_élève = str(input("Voulez-vous lancer une partie de Vocabulary Tester ?\n"))
                          if choix_jeu_élève == "Oui" or choix_jeu_élève == "oui" or choix_jeu_élève == "OUI" :
                              os.system("cls")
                              print("\t\t\tEspace élève :\n")
                              print("Attention, la partie démarre dans...")
                              aide_départ = 4
                              for loop in range (3) :
                                  aide_départ = aide_départ - 1
                                  print(aide_départ) 
                                  sleep(0.25)
                                  os.system("cls")
                                  print("\t\t\tEspace élève :\n")
                                  print("Attention, la partie démarre dans...")
                                  print(aide_départ,".") 
                                  sleep(0.25)
                                  os.system("cls")
                                  print("\t\t\tEspace élève :\n")
                                  print("Attention, la partie démarre dans...")
                                  print(aide_départ,"..") 
                                  sleep(0.25)
                                  os.system("cls")
                                  print("\t\t\tEspace élève :\n")
                                  print("Attention, la partie démarre dans...")
                                  print(aide_départ,"...") 
                                  sleep(0.25)
                                  os.system("cls")
                                  print("\t\t\tEspace élève :\n")
                                  print("Attention, la partie démarre dans...")
                              print ("C'est parti !")
                              sleep(1)
                              mots_run = mots_prof
                              while len(mots_run) != 0:
                                  choose = 2*(random.randint(1,(len(mots_run)/2))-1)
                                  os.system("cls")
                                  print("\t\t\tEspace élève :\n")
                                  answer = str(input("Comment dit-on \"" + mots_run[choose + 1] + "\" en anglais ?\nCela se dit (tout écrire en minuscules) : "))
                                  if answer == mots_run[choose]:
                                      print("\nBravo, c'est ça !")
                                      del mots_run[choose]
                                      del mots_run[choose]
                                      sleep(1)
                                  else :
                                      print("\nNon, c'est \"" + mots_run[choose] + "\". Dommage...")
                                      if not mots_run[choose] in mots_faux :
                                          mots_faux.append(mots_run[choose])
                                      sleep(2)
          
          
                              temo = 1
                              help_error = str(mots_faux[0])
          
                              for loop in range(len(mots_faux) - 1):
                                  help_error = (help_error + ", " + (str(mots_faux[temo])))
                                  temo += 1
          
                              os.system("cls")
                              print("\t\t\tEspace élève :\n")
                              print("Tu as fini !\nMais tu t'es trompé sur les mots " + help_error + "...")
                              sleep(5)
          
                          elif choix_jeu_élève == "Non" or choix_jeu_élève == "non" or choix_jeu_élève == "NON" :
                              os.system("cls")
                              quit_élève1 = False
                              while quit_élève1 == False :
                                  print("\t\t\tEspace élève :\n") 
                                  quit_élève = str(input("Voulez-vous quitter l'espace élève ?\n"))
                                  if quit_élève == "oui" or quit_élève == "Oui" or quit_élève == "OUI" :
                                      choix_élève1 = True
                                      quit_élève1 = True
                                  elif quit_élève == "non" or quit_élève == "Non" or quit_élève == "NON" :  
                                      choix_élève1 = False
                                      quit_élève1 = True
                                  else :
                                      os.system("cls")
                                      print("\t\t\tEspace élève :\n")
                                      print("Mauvais choix. Répondez en un mot.")
                                      sleep(2)
                                      os.system("cls")
                          else :
                              os.system("cls")
                              print("\t\t\tEspace élève :\n")
                              print("Mauvais choix. Répondez en un mot.")
                              sleep(2)
                              os.system("cls")
                  elif choix_menu == "enseignant" or choix_menu == "Enseignant" or choix_menu == "ENSEIGNANT" :
                      os.system("cls")
                      f = open("mdp.dat",'r')
                      mot_de_passe_prof=str(f.readline())
                      f.close()
                      mot_de_passe_entré = str(input("Entrez le mot de passe.\n"))
                      if mot_de_passe_entré == mot_de_passe_prof :
                          os.system("cls")
                          print("\t\t\tEspace enseignant :\n")
                          print("Bienvenue dans l'espace enseignant.")
                          sleep(2)
                          quit_enseignant1 = False
                          while quit_enseignant1 == False :
                              choix_enseignant1 = False
                              while choix_enseignant1 == False :
                                  os.system("cls")
                                  print("\t\t\tEspace enseignant :\n")
                                  print("Que voulez-vous faire ?")
                                  print("-Ajouter un mot (1)")
                                  print("-Supprimer un mot (2)")
                                  print("-Changer le mot de passe (3)")
                                  print("-Quitter l'espace enseignant (4)")
                                  choix_enseignant = str(input("Répondez avec un chiffre.\n"))
                                  if choix_enseignant == "un" or choix_enseignant == "Un" or choix_enseignant == "UN" or choix_enseignant == "1" :
                                      os.system("cls")
                                      print("\t\t\tEspace enseignant :\n")
                                      print("Vous allez ajouter un mot.")
                                      sleep(2)
                                      
                                      os.system("cls")
                                      print("\t\t\tEspace enseignant :\n")
                                      with open("mots.dat", "rb") as x:
                                          mots_prof = pickle.load(x)
                                      x.close()
                                      mot_f_add = str(input("Quel mot souhaitez-vous ajouter en français ?\nMot français (tout en minuscules) : "))
                                      if not mot_f_add in mots_prof :
                                          mot_a_add = str(input("\nComment de traduit-il en anglais ?\nTraduction (tout en minuscules) : "))
                                          mots_prof.append(mot_a_add)
                                          mots_prof.append(mot_f_add)
                                          print("Vous avez ajouté le mot \"" + mot_f_add + "\", traduit par \"" + mot_a_add + "\".")
                                          with open("mots.dat", "wb") as x:
                                              pickle.dump(mots_prof, x)
                                          x.close()
                                          sleep(3)
                                          choix_enseignant1 = True
                                      else :
                                          os.system("cls")
                                          print("\t\t\tEspace enseignant :\n")
                                          print("Le mot \"" + mot_f_add + "\" français a déjà été ajouté.")
                                          sleep(3)
                                      os.system("cls")
                                  elif choix_enseignant == "deux" or choix_enseignant == "DEUX" or choix_enseignant == "Deux" or choix_enseignant == "2" :
                                      os.system("cls")
                                      print("\t\t\tEspace enseignant :\n")
                                      print("Vous allez supprimer un mot.")
                                      sleep(2)
                                      os.system("cls")
                                      print("\t\t\tEspace enseignant :\n")
                                      word_to_delete = str(input("Quel mot français souhaitez-vous supprimer ?\nMot français (en minuscules) : "))
                                      if word_to_delete in mots_prof:
                                          place_word_to_delete = mots_prof.index(word_to_delete)
                                          mots_prof.pop(place_word_to_delete + 1)
                                          mots_prof.pop(place_word_to_delete)
                                          os.system("cls")
                                          print("\t\t\tEspace enseignant :\n")
                                          print("Vous venez de supprimer le mot \"" + word_to_delete + "\".")
                                          with open("mots.dat", "wb") as x:
                                              pickle.dump(mots_prof, x)
                                          x.close()
                                          sleep(3)
                                          choix_enseignant1 = True
                                      else :
                                          print("Le mot \"" + word_to_delete + "\" français n'est pas référencé.")
                                          sleep(2)
                                      os.system("cls")
                                  elif choix_enseignant == "trois" or choix_enseignant == "TROIS" or choix_enseignant == "Trois" or choix_enseignant == "3" :
                                      os.system("cls")
                                      print("\t\t\tEspace enseignant :\n")
                                      print("Vous allez changer votre mot de passe.")
                                      sleep(2)
                                      os.system("cls")
                                      print("\t\t\tEspace enseignant :\n")
                                      change_mot_de_passe_un = str(input("Saisissez votre nouveau mot de passe :\n"))
                                      os.system("cls")
                                      print("\t\t\tEspace enseignant :\n")
                                      change_mot_de_passe_deux = str(input("Confirmez votre nouveau mot de passe :\n"))
                                      if change_mot_de_passe_un == change_mot_de_passe_deux:
                                          print(change_mot_de_passe_un)
                                          mdp=str(change_mot_de_passe_un)
                                          f = open("mdp.dat",'w')
                                          f.write(change_mot_de_passe_un)
                                          f.close()
                                          os.system("cls")
                                          print("Votre mot de passe a bien été changé en \"" + change_mot_de_passe_un + "\".")
                                          sleep(2)
                                      else :
                                          os.system("cls")
                                          print("\t\t\tEspace enseignant :\n")
                                          print("Aïe... Les deux mots de passe sont différents.")
                                          sleep(2)
                                          os.system("cls")
                                      choix_enseignant1 = True
                                      os.system("cls")
                                  elif choix_enseignant == "quatre" or choix_enseignant == "QUATRE" or choix_enseignant == "Quatre" or choix_enseignant == "4" :
                                      os.system("cls")
                                      print("\t\t\tEspace enseignant :\n")
                                      print("Au plaisir de vous revoir.")
                                      sleep(2)
                                      choix_enseignant1 = True
                                      quit_enseignant1 = True
                                      os.system("cls")
                                  else :
                                      os.system("cls")
                                      print("\t\t\tEspace enseignant :\n")
                                      print("Mauvais choix. Veuillez répondre avec le chiffre correspondant au choix et non pas un mot.")
                                      sleep(4)
                                      choix_enseignant1 = False
                                      os.system("cls") 
                      else :
                          os.system("cls")
                          print("Le mot de passe est incorrect.")
                          sleep(2)
                          os.system("cls")
                  else :
                      os.system("cls")
                      print("\t\t\tMenu :\n")
                      print ("Mauvais choix. Veillez à ne pas commettre de faute d'orthographe.")
                      sleep(1)
                      print("Répondez en un seul mot.")
                      sleep(2)
                      os.system("cls")
          0
          1. Modérateur
            Bonjour,

            Plusieurs recommandations :
            • essaye de faire un exemple minimal qui reproduit le problème (voir ci-dessous);
            • indique l'erreur (le message d'erreur complet, pour savoir à quelle ligne ça plante et pourquoi) ;
            • compare le module
              pickle
              importé (en affichant
              sys.path
              , voir code ci-dessous): normalement
              pickle
              est de base et donc tu ne devrais rien avoir à installer avec
              pip
              ;
            • vu que tu sembles manipuler des listes de chaînes de caractères,
              pickle
              suffit, mais sache que pour des structures de données plus évoluées il faudrait utiliser
              dill
              ;
            • je te déconseille très fortement les caractères spéciaux (notamment les caractères accentués dans tes noms de variables) surtout si tu ne mets pas le header
              # -*- coding: utf-8 -*-
              en début de fichier (voir par exemple cette page).


            #!/usr/bin/env python3
            # -*- coding: utf-8 -*-
            
            import pickle, sys, traceback
            
            print(sys.path)
            mots = ["mot1", "mot2", "mot3"]
            
            try:
                with open("mots.dat", "wb") as f:
                    pickle.dump(mots, f)
            except:
                print(traceback.format_exc(), sys.stderr)
            print(mots)
            
            try:
                with open("mots.dat", "rb") as f:
                    mots = pickle.load(f)
            except:
                print(traceback.format_exc(), sys.stderr)
            print(mots)


            Copie-colle nous le résultat de ce programme (dans et en dehors de visual studio).

            Bonne chance
            0
            1. Voilà ce que j'obtiens sur Python 3.9

              Python 3.9.12 (tags/v3.9.12:b28265d, Mar 23 2022, 23:52:46) [MSC v.1929 64 bit (AMD64)] on win32
              Type "help", "copyright", "credits" or "license" for more information.
              >>> #!/usr/bin/env python3
              >>> # -*- coding: utf-8 -*-
              >>>
              >>> import pickle, sys, traceback
              >>>
              >>> print(sys.path)
              ['', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\\python39.zip', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\\DLLs', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\\lib', 'C:\\Users\\lucas\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\\lib\\site-packages']
              >>> mots = ["mot1", "mot2", "mot3"]
              >>>
              >>> try:
              ... with open("mots.dat", "wb") as f:
              ... pickle.dump(mots, f)
              ... except:
              ... print(traceback.format_exc(), sys.stderr)
              ... print(mots)
              File "<stdin>", line 6
              print(mots)
              ^
              SyntaxError: invalid syntax
              >>>
              >>> try:
              ... with open("mots.dat", "rb") as f:
              ... mots = pickle.load(f)
              ... except:
              ... print(traceback.format_exc(), sys.stderr)
              ... print(mots)
              File "<stdin>", line 6
              print(mots)
              ^
              SyntaxError: invalid syntax
              >>>


              Et sur Visual Studio Code...

              Windows PowerShell
              Copyright (C) Microsoft Corporation. Tous droits réservés.

              Testez le nouveau système multiplateforme PowerShell https://aka.ms/pscore6

              PS C:\Users\lucas\Downloads> & 'C:\Users\lucas\AppData\Local\Microsoft\WindowsApps\python3.10.exe' 'c:\Users\lucas\.vscode\extensions\ms-python.python-2022.4.1\pythonFiles\lib\python\debugpy\launcher' '62079' '--' 'c:\Users\lucas\Downloads\Untitled-1.py'
              ['c:\\Users\\lucas\\Downloads', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.1264.0_x64__qbz5n2kfra8p0\\python310.zip', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.1264.0_x64__qbz5n2kfra8p0\\DLLs', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.1264.0_x64__qbz5n2kfra8p0\\lib', 'C:\\Users\\lucas\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0', 'C:\\Users\\lucas\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python310\\site-packages', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.1264.0_x64__qbz5n2kfra8p0', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.1264.0_x64__qbz5n2kfra8p0\\lib\\site-packages']
              ['mot1', 'mot2', 'mot3']
              ['mot1', 'mot2', 'mot3']
              PS C:\Users\lucas\Downloads>


              Je ne comprends pas pourquoi...
              0
              1. Modérateur
                Pour l'erreur de syntaxe : je pense que tu as eu un problème de copier coller. Le mieux serait de copier coller le bout de code que je t'ai donné dans un fichier (mettons
                toto.py
                ) puis que tu exécutes
                python toto.py
                .

                Ensuite la différence de comportement s'explique par
                sys.path
                qui n'est pas défini de la même manière dans python et dans VS. Si on compare ces deux listes, on voit qu'elles sont différentes : ci-dessous
                • la première colonne indique si le chemin indiqué en 3e colonne est dans
                  sys.path
                  pour
                  python3.9
                  ;
                • la seconde colonne indique si le chemin indiqué en 3e colonne est dans
                  sys.path
                  pour VS ;


                True False ''
                False True 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.1264.0_x64__qbz5n2kfra8p0'
                False True 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.1264.0_x64__qbz5n2kfra8p0\\DLLs'
                False True 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.1264.0_x64__qbz5n2kfra8p0\\lib'
                False True 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.1264.0_x64__qbz5n2kfra8p0\\lib\\site-packages'
                False True 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.1264.0_x64__qbz5n2kfra8p0\\python310.zip'
                True False 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0'
                True False 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\\DLLs'
                True False 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\\lib'
                True False 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\\lib\\site-packages'
                True False 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\\python39.zip'
                False True 'C:\\Users\\lucas\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0'
                True False 'C:\\Users\\lucas\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0'
                False True 'C:\\Users\\lucas\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python310\\site-packages'
                False True 'c:\\Users\\lucas\\Downloads'


                Cela suffit à expliquer pourquoi le comportement n'est pas le même. Cela semble dû à la coexistence de deux installations de python : VS utilise
                python3.10
                tandis que tu utilises manuellement
                python3.9
                .

                Bonne chance
                0
                1. Contributeur
                  Vois aussi si le fichier est accessible depuis les deux environments.
                  Peut-être bien d'essayer sans le try.
                  0