Problème avec pickle

SolooslO -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
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

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
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
SolooslO
 
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
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
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
SolooslO
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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
SolooslO
 
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
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
Vois aussi si le fichier est accessible depuis les deux environments.
Peut-être bien d'essayer sans le try.
0