Partage
  • Partager sur Facebook
  • Partager sur Twitter

Dysfonctionnement lancement de programme PYTHON

Lancement à partir de BATCH

Sujet résolu
    17 décembre 2023 à 10:57:06

    Bonjour,

    Depuis plusieurs jours, je ne parviens pas à trouver la solution à un problème rencontré. 

    J'ai crée un script PYTHON composé de plusieurs procédures contenant des instructions portées vers un but : affichage de graphique, chargement de données, calculatrice...

    Si j'exécute le script PYTHON à partir de l'IDLE, tout fonctionne bien.

    Si j'exécute à partir d'un fichier BATCH, il y a dysfonctionnement. En effet, dans mes procédures, j'ai introduit la structure Try, Except, Else en tant que gestion d'erreur. Dès l'exécution depuis ce fichier BATCH, PYTHON entre dans le bloc Except, ce qui est faux puisque la condition dans Try est remplie. La condition est la vérification de l'existence de deux fichiers dans un chemin. 

    Je ne comprends pas. Cela m'agace. 

    SCRIPT BATCH : 

    @echo off
    color 0A
    echo %USERNAME%
    echo %DATE%
    echo.
    title Expenses for food
    echo Hello!
    
    echo ____________________________________________________________
    echo SCRIPT RUNNING
    echo ____________________________________________________________
    
    rem Powershell.exe -ExecutionPolicy UnRestricted -Command C:\Users\Jeannine\Desktop\Applications_python\trial.ps1 
    
    "C:\Users\Jeannine\AppData\Local\Programs\Python\Python311\python.exe"	"C:\Users\Jeannine\Desktop\Applications_python\Expenses_VERSION10.py"
    
    echo.
    
    echo ____________________________________________________________
    echo SCRIPT TERMINATED.
    echo ____________________________________________________________
    
    
    timeout /t 05>nul

    PARTIE DU PROGRAMME PYTHON :

    def GRAPHICS():
        try:
            Expenses_file=open("Expenses.txt","r")
            Times_file=open("Times.txt","r")
            Expenses_file.close()
            Times_file.close()
    
        except:
            print("Times.txt and Expenses.txt files don't exist.")
            print("Check if names of files haven't changed.")
    
        else:
    
            try:
                with open("Times.txt","r") as x:
                    liste_x=x.read().split("\n")
                with open("Expenses.txt","r") as file: #Conversion de la liste de chaîne de caractères en liste de float
                    liste_y = [float(line) for line in file]
                bar(liste_x, liste_y, 0.1, color='b')
            except:
                print("Put in Times.txt only times datas under format mm/yyyy")
                print("Put in Expenses.txt only numbers, anything else.")
                print("You have to delete last lines of Times.txt or Expenses.txt and write new datas.")
            else:
                xticks(liste_x, rotation=40)
    
                xlabel("time(month per year)")
                ylabel("Expenses for food (€)")
                title("Expenses for food=f(t)")
                grid()
                hlines(400,liste_x[0],liste_x[len(liste_x)-1],'red')   
    
                savefig('Datas.pdf')
                savefig('Datas.jpg')
                show()

    Si quelqu'un aurait quelque suggestion. 

    Merci à vous. 


    -
    Edité par LHH_120 18 décembre 2023 à 16:44:16

    • Partager sur Facebook
    • Partager sur Twitter
      17 décembre 2023 à 11:18:12

      Dès l'exécution depuis ce fichier BATCH, PYTHON entre dans le bloc Except, ce qui est faux puisque la condition dans Try est remplie.

      Si c'est vrai !

      Python ne se trompe pas, il recherche un fichier relatif depuis l'emplacement de ton fichier batch.

      Si ton fichier batch et python ne sont pas dans le même emplacement, il est normal qu'il ne trouve rien.

      Pour cela dans ton fichier python, tu dois travailler avec les chemins absolus et non relatifs.

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        17 décembre 2023 à 14:45:39

        Etudiant31 a écrit:

        Dès l'exécution depuis ce fichier BATCH, PYTHON entre dans le bloc Except, ce qui est faux puisque la condition dans Try est remplie.


        Vous ne prenez pas la peine d'afficher le libellé de l'exception pour comprendre pourquoi l'exécution de ce code y aboutit... et vous concluez qu'il y a un bug dans python (puisqu'il ne devrait pas lever d'exception...). Si vous n'exploitez pas les informations que vous devriez avoir, vous allez patauger longtemps.

        • Partager sur Facebook
        • Partager sur Twitter
          18 décembre 2023 à 16:39:28

          Bonjour à vous deux,

          Je confirme que les scripts BATCH, PYTHON ainsi que les fichiers Expenses.txt et Times.txt sont dans le même dossier local. 

          Vous répondant de mon lieu de travail, je testerai chez moi. Je remplacerai les noms mentionnés des deux fichiers dans "with open"  par les chemins d'accès absolus menant vers ces fichiers mais je suis sceptique. 

          mps, je vois ce que vous voulez dire. J'ai crée mon propre libellé de l'exception, à savoir  :       

                  print("Times.txt and Expenses.txt files don't exist.")
                  print("Check if names of files haven't changed.")


          ce qui empêche PYTHON d'imprimer le libellé pertinent. En gros c'est votre propos. 

          Ceci étant dit, cela n'explique pas pourquoi à partir de l'exécution du script BATCH le programme PYTHON ne fonctionne pas correctement alors que son exécution directement dans l'IDLE fonctionne sans la moindre exception ou erreur constatée. 

          Bon je vais essayer de retoucher le script PYTHON. 

          -
          Edité par LHH_120 18 décembre 2023 à 16:54:40

          • Partager sur Facebook
          • Partager sur Twitter
            18 décembre 2023 à 17:28:16

            Etudiant31 a écrit:

            Ceci étant dit, cela n'explique pas pourquoi à partir de l'exécution du script BATCH le programme PYTHON ne fonctionne pas correctement alors que son exécution directement dans l'IDLE fonctionne sans la moindre exception ou erreur constatée.

            Sans message d'erreur, on pourrait imaginer des "pourquoi".

            Mais  programmer n'est pas un jeu de devinettes.

            On économisera le temps d'explorer d'éventuelles fausses pistes en partant du message d'erreur pour comprendre ce pourquoi.

            Pire, sans message d'erreur, on ne peut même pas essayer chez nous puisqu'on ne sait que reproduire!

            • Partager sur Facebook
            • Partager sur Twitter
              18 décembre 2023 à 22:13:09

              Je vois  que le programme python se trouve dans

              "C:\Users\Jeannine\Desktop\Applications_python\Expenses_VERSION10.py"

              1. Sous idle, vous travaillez probablement dans le même répertoire "C:\Users\Jeannine\Desktop\Applications_python", où se trouvent également les fichiers Expenses.txt et Times.txt.

              Ce qui explique que ça marche sous IDLE, puisque  le chemin relatif Expenses.txt cité dans le script correspond au bien au chemin absolu C:\Users\Jeannine\Desktop\Applications_python\Expenses.txt parce que python est lancé depuis ce même répertoire.

              2. Maintenant, en lançant le batch (qui lance le programme python) depuis, par exemple   C:\TEMP, le même chemin relatif Expenses.txt correspond au chemin absolu C:\TEMP\Expenses.txt.  Et là, Python ne trouve pas les fichiers de données, il fait son boulot qui est de lever une exception et la clause Except est exécutée, tout à fait normalement. Ça s'explique très bien.

               ---

              Proposition de correction : que le batch transmette au programme python un paramètre,  le chemin absolu du dossier qui contient les fichiers de données. et que le programme python s'en serve  pour construire les chemins absolus des fichiers (ou se déplacer dans ledit dossier)

              Une autre solution : que le batch fasse un "cd C:\Users\Jeannine\Desktop\Applications_python" avant de lancer le programme python. (*)

              (on peut en imaginer d'autres, un fichier de configuration qui contient les informations sur les fichiers à utiliser)


              (*) Ca serait sans doute mieux que cette application de gestion des dépenses soit dans un dossier spécifique, plutôt que dans un "Applications_python" qui va vite tourner au foutoir.   Un sous-dossier Applications_python\Expenses ferait le job. Ou Applications_python\Expenses-v1

              PS si les données sont toujours dans le même dossier que le programme python, on peut se servir de  os.path.dirname(__file__)  pour savoir où est ce dossier.

              https://note.nkmk.me/en/python-script-file-path/

              import os
              
              print('[set target path 1]')
              target_path_1 = os.path.join(os.path.dirname(__file__), 'target_1.txt')
              
              print('target_path_1: ', target_path_1)
              
              print('read target file:')
              with open(target_path_1) as f:
                  print(f.read())
              

              -
              Edité par michelbillaud 19 décembre 2023 à 12:35:47

              • Partager sur Facebook
              • Partager sur Twitter
                19 décembre 2023 à 19:03:23

                Bonjour Messieurs,

                je n'ai pu revenir plus tôt. J'ai pris le temps d'étudier le problème. J'ai finis par identifier seul la cause du problème. 

                Quel est le symptôme ? certaines fonctions du programme ne sont pas exécutées. 

                Que me dit PYTHON ? J'ai supprimé ma propre exception pour le laisser s'exprimer. Surprise, il m'indique que les fichiers Expenses.txt et Times.txt ne sont pas trouvés. 

                Jeannine
                19/12/2023
                
                Hello!
                ____________________________________________________________
                SCRIPT RUNNING
                ____________________________________________________________
                Exception in Tkinter callback
                Traceback (most recent call last):
                  File "C:\Users\Jeannine\AppData\Local\Programs\Python\Python311\Lib\tkinter\__init__.py", line 1948, in __call__
                    return self.func(*args)
                           ^^^^^^^^^^^^^^^^
                  File "C:\Users\Jeannine\Desktop\Applications_python\Expenses_VERSION10 - Copie.py", line 67, in GRAPHICS
                    Expenses_file=open("Expenses.txt","r")
                                  ^^^^^^^^^^^^^^^^^^^^^^^^
                FileNotFoundError: [Errno 2] No such file or directory: 'Expenses.txt'
                

                Solution à mettre en œuvre ? J'ai introduit le chemin d'accès absolu dans open comme ceci :

                 try:
                        Expenses_file=open("C:/Users/Jeannine/Desktop/Applications_python/Expenses.txt","r")
                        Times_file=open("C:/Users/Jeannine/Desktop/Applications_python/Times.txt","r")
                        Expenses_file.close()
                        Times_file.close()


                Quel est le résultat à la compilation ? aucun exception levée. Tout fonctionne bien. 

                Je dirais que sous l'effet de l'agacement, je n'ai pas pris la peine de consacrer suffisamment de temps à l'identification de la cause du problème. Ce qui n'est pas le cas d'ordinaire en entreprise. 

                Mps, je sais fort bien qu'il faut en guise de point de départ de tout raisonnement partir de l'exception levée par PYTHON permettant ainsi d'orienter la réflexion menant à la solution du problème donné. Ne me réprimander pas tout de même. Cela arrive. J'aurais PU éviter de diffuser ce message dans la précipitation d'autant que dans le calme on finit par y arriver. 

                MichelBillaud, c'est une solution intéressante en effet. Je la conserve pour une prochaine application à créer. Merci du temps consacré. 

                -
                Edité par LHH_120 19 décembre 2023 à 19:08:09

                • Partager sur Facebook
                • Partager sur Twitter
                  20 décembre 2023 à 11:08:51

                  Etudiant31 a écrit:

                  '

                  Solution à mettre en œuvre ? J'ai introduit le chemin d'accès absolu dans open comme ceci :

                   try:
                          Expenses_file=open("C:/Users/Jeannine/Desktop/Applications_python/Expenses.txt","r")
                          Times_file=open("C:/Users/Jeannine/Desktop/Applications_python/Times.txt","r")
                          Expenses_file.close()
                          Times_file.close()

                  [ os.path.dirname(__file__) ]


                  MichelBillaud, c'est une solution intéressante en effet. Je la conserve pour une prochaine application à créer. Merci du temps consacré. 

                  -
                  Edité par Etudiant31 il y a environ 15 heures


                  Faut pas accumuler de la "dette technique". La prochaine application on copie-collera des bouts de ce qui marche.... on se demandera quel était le truc à faire, on retrouvera pas, et on reproduira sans améliorer => emmerdements.  Donc, corriger maintenant que c'est encore chaud.

                  Au minimum, avoir une variable pour mettre le nom du répertoire.

                  data_dir = "C:/Users/....../"
                  Expenses_file = open(data_dir + "Expenses.txt")
                  Times_file    = open(data_dir + "Times.txt")
                  
                  
                  parce que le nom revient deux fois

                  Puis se dire que ça va faire des problèmes quand on va déplacer l'application ailleurs, donc, utiliser les fonctions qui font le job

                  data_dir = os.path.dirname(os.path.abspath(__file__))
                  Expenses_file = open(data_dir + "/" + "Expenses.txt", "r")
                  Times_file    = open(data_dir + "/" + "Times.txt",    "r")
                  
                  
                  Puis se dire dire que c'est moche - dépendant du système - d'ajouter le /, alors pour que ça soit tout bien employer un join plutôt qu'une concaténation
                   
                  data_dir = os.path.dirname(os.path.abspath(__file__))
                  Expenses_file = open(os.path.join(data_dir, "Expenses.txt"), "r")
                  Times_file    = open(os.path.join(data_dir, "Times.txt")n    "r")

                  Variante , on botte en touche

                  Expenses_file = open(data_file("Expenses.txt"), "r")
                  Times_file    = open(data_file("Times.txt"),    "r")
                  

                  avec la petite fonction

                  def data_file(name):
                      d = os.path.dirname(os.path.abspath(__file__))
                      return os.path.join(d, name)
                  


                  -
                  Edité par michelbillaud 20 décembre 2023 à 18:15:30

                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 décembre 2023 à 14:06:25

                    Etudiant31 a écrit:

                    Mps, je sais fort bien qu'il faut en guise de point de départ de tout raisonnement partir de l'exception levée par PYTHON permettant ainsi d'orienter la réflexion menant à la solution du problème donné. Ne me réprimander pas tout de même. Cela arrive. J'aurais PU éviter de diffuser ce message dans la précipitation d'autant que dans le calme on finit par y arriver.

                    Si vous n'arrivez pas à utiliser ce que vous savez, savoir ne vous sert à rien.

                    Après, si vous utilisez un block try...except... il faut expliciter les exceptions gérées. Ecrire:

                        try:
                            Expenses_file=open("Expenses.txt","r")
                            Times_file=open("Times.txt","r")
                            Expenses_file.close()
                            Times_file.close()
                     
                        except:
                            print("Times.txt and Expenses.txt files don't exist.")
                            print("Check if names of files haven't changed.")
                     
                        else:
                     
                            try:
                                with open("Times.txt","r") as x:
                                    liste_x=x.read().split("\n")
                                with open("Expenses.txt","r") as file: #Conversion de la liste de chaîne de caractères en liste de float
                                    liste_y = [float(line) for line in file]

                    est une collections d’âneries. Préférez:

                    def GRAPHICS():
                        try:
                            Expenses_file=open(...)
                            Times_file=open(...)
                     
                        except FileNotFound:
                            print("Times.txt and Expenses.txt files don't exist.")
                            print("Check if names of files haven't changed.")
                     
                        else:
                            with Expenses_file:
                                liste_x=Expenses_file.read().split("\n")
                            with Times_file:
                                liste_y = [float(line) for line in Times_file]
                    try: bar(liste_x, liste_y, 0.1, color='b') except <exception gérée>...:

                    ou:

                    def GRAPHICS():
                        try:
                            with open(...) as f:
                               liste_x=f.read().split("\n")
                            with open(...) as f:
                                liste_y = [float(line) for line in f] 
                        except FileNotFound:
                            print("Times.txt and Expenses.txt files don't exist.")
                            print("Check if names of files haven't changed.")
                     
                        else:
                            try:
                                bar(liste_x, liste_y, 0.1, color='b')
                            except <exception gérée>...:



                    et ouvrez votre tuto préféré sur la gestion des exceptions pour revoir tout çà (avant de demander de l'aide...)

                    -
                    Edité par mps 20 décembre 2023 à 16:07:25

                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 décembre 2023 à 14:50:28

                      Je pense aussi que l'on peut optimiser tout cela. Etant donné que c'est un programme à des fins personnelles, je ne l'ai pas élaboré avec autant de rigueur que ce que je fais en entreprise. Je vais optimiser. 

                      Je n'ai jamais dis que je ne savais pas exploiter un savoir donné. J'ai dit que je reconnais le tort que j'ai eu de m'être précipité en étant agacé, sans avoir pris le temps de mener l'enquête jusqu'au bout. C'est tout. D'ailleurs, j'ai fini par trouver dans le calme. 

                      -
                      Edité par LHH_120 20 décembre 2023 à 15:00:31

                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 décembre 2023 à 16:14:34

                        Etudiant31 a écrit:

                        Je pense aussi que l'on peut optimiser tout cela. Etant donné que c'est un programme à des fins personnelles, je ne l'ai pas élaboré avec autant de rigueur que ce que je fais en entreprise. Je vais optimiser. 

                        Optimiser, c'est faire pareil ou mieux avec moins de ressources. Ca n'a rien à voir avec une mise en œuvre correcte des constructions utilisées. D'ailleurs le pourquoi du pourquoi montre une confusion entre répertoire par défaut et répertoire du script voire l'à priori d'avoir données et scripts au même endroit (ce qui n'est pas très sain).

                        Etudiant31 a écrit:

                        Je n'ai jamais dis que je ne savais pas exploiter un savoir donné.

                        On ne peut faire qu'avec ce que vous voulez bien montrer...

                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 décembre 2023 à 16:53:50

                          Optimiser c'est porter à un plus haut degré d'efficacité quelque chose, un processus... C'est une définition vague j'en conviens.

                          Je l'entendais autrement ici. Je voulais dire : augmenter la robustesse du code, envisager des cas de figure nouveaux, le rendre adaptable... mais ce que vous dites est juste aussi. 

                          En tant qu'utilisateur, je me dois de rappeler que nous ne devrions pas nous quereller mais bien progresser tous ensemble. On propose une réorientation d'un raisonnement particulier en vue d'une solution à mettre en œuvre au regard d'un problème donné. Grâce à ce travail d'émulation, il y a une progression de tous. Tel est le but de ce forum. Un forum est un espace public d'entraide, convivial et professionnel.  

                          Nous avons tous des niveaux différents et cela ne devrait pas constituer une raison pour se donner le droit d'être condescendant avec le reste du monde.  C'est une question de savoir-vivre en société. Cela s'applique à tous. 

                          -
                          Edité par LHH_120 20 décembre 2023 à 17:15:07

                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 décembre 2023 à 18:05:24

                            Etudiant31 a écrit:

                            Nous avons tous des niveaux différents et cela ne devrait pas constituer une raison pour se donner le droit d'être condescendant avec le reste du monde.  C'est une question de savoir-vivre en société. Cela s'applique à tous.

                            Le français est une langue précise, autant l'utiliser à bon escient.... et il demande autant de rigueur que l'écriture de code.

                            A vous de vous appliquer tant en français qu'avec python: si vous exprimez quelque chose, c'est pour être lu et compris... Si vous débutez, vous ferez des erreurs (et nous avons tous débuté il y a plus ou moins longtemps)... qui suggérerons de revoir certaines notions.

                            Assumez plutôt que de vous réfugier dans le déni ou jeter des anathèmes avec des mots dont vous ne saisissez pas trop le sens: ça ne vous aidera pas.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 décembre 2023 à 19:25:15

                              Je ne vois pas en quoi je n'assume pas quoi que ce soit puisque j'ai reconnu à deux reprises le tort que j'avais. De surcroît, j'ai bien précisé que je n'ai pas construit ce code avec autant de rigueur que tout ce que j'ai fait en milieu professionnel. A ce propos, je ne m'éloigne pas de la question suivante : qu'est-ce qu'un bon code ? je songe à une page d'un site du CNRS qui explique tout cela. 

                              Concernant le terme "Optimiser", on peut y voir plusieurs sens. 

                              Vous voyez, vous ne me lisez pas attentivement. C'est vous qui êtes dans le déni. C'est vous qui laissez entendre, à tort, que je ne comprends pas les mots que j'emploie ou que je ne comprends pas ce que je fais, ce qui est d'une absurdité sans nom. C'est vous qui êtes désagréable depuis le début de ces échanges. Vos messages conduisent à penser que votre interlocuteur est un idiot, en l'occurrence moi. Tout ce que vous dites est imprégné de préjugés. 

                              Vous êtes antipathique Monsieur. 

                              Vous seriez bien inspiré de vous rendre à l'évidence que les relations humaines ne sont pas votre fort.  

                              Je pense qu'il est préférable de vous laisser dans vos illusions.

                              -
                              Edité par LHH_120 20 décembre 2023 à 22:15:06

                              • Partager sur Facebook
                              • Partager sur Twitter
                                21 décembre 2023 à 18:40:03

                                Etudiant31 a écrit:

                                Concernant le terme "Optimiser", on peut y voir plusieurs sens. 

                                Dans un forum public, la définition commune du Larousse ou du petit Robert sera le défaut... sauf si le forum publie un glossaire pour définir un vocabulaire spécifique.

                                Rien n'empêche d'utiliser d'autres définition mais dans ce cas, la politesse sera de partager la définition utilisée avant

                                .

                                Etudiant31 a écrit:

                                Vous êtes antipathique Monsieur. 

                                Vous seriez bien inspiré de vous rendre à l'évidence que les relations humaines ne sont pas votre fort.  

                                Dans un forum de programmation, le sujet est dans les relations avec le langage de programmation.

                                Pour échanger, il faut avoir un vocabulaire partagé et un minimum de rigueur. Entre les "ce n'est pas ce que je voulais dire" ou "ce n'est pas la bonne définition", cela ne semble pas être à votre portée. Et si être antipathique, c'est vous faire remarquer que vous manquez de rigueur que ce soit avec Python qu'en français, je l'assume tout à fait (contrairement à vous).

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  22 décembre 2023 à 9:56:18

                                  Bonjour,

                                  Une langue donnée recèle une quantité finie de mots désignant quelque chose ou quelqu'un, une réalité, un fragment du réel. Certains ont un seul sens, d'autres en ont plusieurs. 

                                  Le terme que j'ai choisi me paraît judicieux. Libre à vous d'apprécier le choix. 


                                  C'est quand même fort de café (expression que vous ne connaissez probablement pas) de voir quelqu'un parler de politesse, alors que cette même personne s'abstient de dire "Bonjour" dès son premier message, pour ne pas parler du reste la concernant. 

                                  <<Dans un forum de programmation, le sujet est dans les relations avec le langage de programmation.>> 

                                  On traite de sujets de programmation informatique. Cela va de soi. Par ailleurs, il y a des règles de bienséance à observer, évidence qui ne l'est pas vous. Lorsque l'on est pas capable d'échanger, d'argumenter dans le respect d'autrui,on ne diffuse pas de message, on n'intervient pas dans l'espace public.

                                  <<Pour échanger, il faut avoir un vocabulaire partagé et un minimum de rigueur. Entre les "ce n'est pas ce que je voulais dire" ou "ce n'est pas la bonne définition", cela ne semble pas être à votre portée. Et si être antipathique, c'est vous faire remarquer que vous manquez de rigueur que ce soit avec Python qu'en français, je l'assume tout à fait (contrairement à vous).>>

                                  Les hommes ont inventé un système d'expression verbale complexe, une convention c'est-à-dire une langue en vue de communiquer et de se comprendre.                                                                                                 

                                  Dans les termes employés, je ne vois aucun problème, hormis un passage dans l'un de mes messages, au début, car je suis allé vite, erreur de ma part. J'ai, pour la quatrième fois, reconnu que j'ai manqué de rigueur dans ce code. Encore une fois, vous ne me lisez pas attentivement. C'est important de savoir se remettre en question pour progresser, évidence qui ne l'est pas pour vous.

                                  Pour avoir travaillé avec des ouvriers, des techniciens, des ingénieurs, managers et directement avec des chefs d'entreprises après des études scientifiques et techniques avant une intégration en classe prépa à l'IEP (Institut d'Etudes Politiques) je pense que vous n'avez aucune légitimité à formuler des jugements sur ma personne.


                                  Je profite de votre intervention inutile pour vous rappeler qu'un forum, aussi connu soit-il, n'est pas une tribune car cela prend la forme d'une tribune. Dans l'intérêt de tous et d'OPENCLASSROOM, je vais mettre un terme à cette discussion. 

                                  Merci aux autres pour leur apport. 

                                  A l'occasion d'un prochain message de ma part à l'avenir, je vous demande de ne pas intervenir. Si vous le faites, je mettrais un terme à la discussion et procéderai à un signalement. 




                                  -
                                  Edité par LHH_120 22 décembre 2023 à 10:51:35

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Dysfonctionnement lancement de programme PYTHON

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  • Editeur
                                  • Markdown