Partage
  • Partager sur Facebook
  • Partager sur Twitter

Connaître le code de sortie

exit(x)

Sujet résolu
    11 octobre 2021 à 16:32:14

    Bonjour,

    J'ai fais un script en python 3. Malheureusement, lorsque je mets des exit, s'il y a une erreur son numéro n'est pas renvoyé dans la console.

    Voici un bout de mon script :

    def sql_restore(DB_HOST, DB_USER, DB_USER_PASSWORD, DB_NAME, BACKUP_PATH):
    	try:
    		#	MYSQLDUMP
    		print("Début de la restauration MySQL...")
    		# La ligne de code qui sera exécutée par subprocess.
    		dumpcmd = "mysql -h " + DB_HOST + " -u " + DB_USER + " -p" + DB_USER_PASSWORD + " " + DB_NAME + " < " + BACKUP_PATH + DB_NAME + ".sql"
    		subprocess.run(dumpcmd, shell=True)
    		# Un print pour voir ce qui est clairement saisie.
    		print("Fin de la restauration MySQL.")
    	except:
    		# MySQLdump peut générer des erreurs mais poursuivre correctement malgré tout...
    		exit(5)

    En cas d'exception, le script va bien s'arrêter, mais son numéro d'erreur n'est pas renvoyé, ou du moins j'ignore comment le récupérer.

    Savez-vous comment on doit faire ? J'ai essayé différente chose mais là je ne sais pas comment on doit faire

    Je suis sous Debian 11 (si jamais ça change quelque chose...).

    Merci par avance !

    -
    Edité par Owo 13 octobre 2021 à 17:16:21

    • Partager sur Facebook
    • Partager sur Twitter
      11 octobre 2021 à 16:51:56

      Bonjour,

      Comme ceci:

      except:
          print('''\nErreur :''', sys.exc_info()[1])


      (avec import sys en début de code)

      • Partager sur Facebook
      • Partager sur Twitter
        12 octobre 2021 à 13:26:49

        l'autre solution c'est de ne pas utiliser de bloc try/except :-°
        • Partager sur Facebook
        • Partager sur Twitter
          12 octobre 2021 à 13:32:16

          Bonjour,

          Merci ! Mais je reste frustré, je veux réussir à obtenir le code erreur, mais sans un print.

          C'est l'une des choses que mon mentor m'a demandé de faire.

          Et là je bloque totalement...

          J'ai cherché sur la doc en ligne de python, sur stackoverflow...

          • Partager sur Facebook
          • Partager sur Twitter
            12 octobre 2021 à 15:14:42

            Bonjour,

            Qu'entend-tu par "obtenir le code erreur " exactement ?

            A quel résultat t'attend-tu et que veux tu en faire ?

            Normalement le code erreur est dans sys.exec_info()

            As-tu essayé un print(sys.exec_info()) pour voir ce que ça donne et si ce qui est dedans t'intéresse ou pas ?

            • Partager sur Facebook
            • Partager sur Twitter
              12 octobre 2021 à 17:05:56

              Tu veux retourner le message d'erreur de la commande passé à subprocess.run, si je comprends bien?

              Dans ce cas-là, le try/except ne doit pas servir à grand chose; il faut récupérer le retour de l'appel à subprocess.run, et lui passer le paramètre capture_output=True. Dans le résultat, tu récupèreras les infos de la commande.

              https://docs.python.org/3/library/subprocess.html?highlight=subpr%20run#subprocess.run

              def sql_restore(DB_HOST, DB_USER, DB_USER_PASSWORD, DB_NAME, BACKUP_PATH):
                  try:
                      #   MYSQLDUMP
                      print("Début de la restauration MySQL...")
                      # La ligne de code qui sera exécutée par subprocess.
                      dumpcmd = "mysql -h " + DB_HOST + " -u " + DB_USER + " -p" + DB_USER_PASSWORD + " " + DB_NAME + " < " + BACKUP_PATH + DB_NAME + ".sql"
                      res=subprocess.run(dumpcmd, shell=True, capture_output=True, text=True)
                      print(res.args) #commande
                      print(res.returncode) #code retour
                      print(res.stdout) #sortie standard
                      print(res.stderr) #sortie erreurs
              
                      # Un print pour voir ce qui est clairement saisie.
                      print("Fin de la restauration MySQL.")
                  except:
                      # MySQLdump peut générer des erreurs mais poursuivre correctement malgré tout...
                      exit(5)

              PS: j'ai rajouté le paramètre text=True dans l'appel pour que les messages stdout et stderr soient directement des chaines, sinon ce sont des tableaux de bytes

              • Partager sur Facebook
              • Partager sur Twitter
                13 octobre 2021 à 17:06:22

                Au temps pour moi, expliqué ça à l'écrit n'est pas très simple :-/

                J'entends par là obtenir le numéro contenu dans la fonction exit(). Dans mon script j'ai un dizaine d'exit(), dans mon exemple c'est le chiffre 5, j'aimerai savoir comment le "récupéré" en cas de bug.

                Si j'ai ce numéro, je sais quelle partie du code a rencontré un problème. Mais je dois le faire sans un print ni une fonction spécifique (ce qui serai plus simple mais apparemment il y a une bonne raison).

                Ça fait partie de l'objectif du projet... Je sais pas si c'est plus clair ?

                Merci pour ton tips, je vais essayé !

                [MAJ] En écumant le web on parle de code de sortie et non les autres termes que j'ai emprunté....

                -
                Edité par Owo 13 octobre 2021 à 17:17:44

                • Partager sur Facebook
                • Partager sur Twitter
                  13 octobre 2021 à 17:51:35

                  Owoln a écrit:

                  J'entends par là obtenir le numéro contenu dans la fonction exit(). Dans mon script j'ai un dizaine d'exit(), dans mon exemple c'est le chiffre 5, j'aimerai savoir comment le "récupéré" en cas de bug.

                  C'est l'engin qui lance le programme qui va récupérer le code d'exit.

                  Par exemple, avec un terminal windows (cmd.exe), il faudra faire echo  %errorlevel% sous Linux/Bash ce sera echo $?... Si le script est lancé avec os.system ou subprocess, çà sera encore autre chose (pour le récupérer).

                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 octobre 2021 à 15:42:59

                    Désolé mps, je n'avais pas reçu de notif, mais c'est bien ça !

                    Ça donne ceci :

                    Merci à tous pour votre aide !

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Connaître le code de sortie

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown