Partage
  • Partager sur Facebook
  • Partager sur Twitter

Enregistrer résultat de os.system dans variable

Sujet résolu
    21 octobre 2022 à 20:51:33

    Bonjour,

    Dans l'un de mes scripts, je veux enregistrer la taille totale de la RAM sur ma vm.

    Le problème, c'est qu'au lieu d'enregistrer la valeur, le resultat s'affiche instananement, et la variable vaut 0.

    Voila un exemple :

    >>> import os
    >>> memory = os.system("free -b | awk 'FNR == 2 {print $2}'")
    4121980928
    >>> print(memory)
    0
    

    Quelqu'un pourrait me dire d'où vient le problème ?

    Merci.

    • Partager sur Facebook
    • Partager sur Twitter
      22 octobre 2022 à 1:47:37

      Ce qui est affiché par les commandes dans os.system s'en va directement à la console.
      memory vaut le statut d'erreur de l'exécution, donc 0 ici puisqu'il n'y a aucune erreur.
      Tu pourrait rediriger l'output dans un fichier et le faire lire par Python.
      Par exemple, envoie ton output dans  dummy.py  sous la forme:
      variable = le_résultat_attendu
      Puis tu fais:
      from dummy import variable
      print(variable)
      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        22 octobre 2022 à 11:32:13

        ou sinon tu peux aussi utilise subprocess qui lui peut capturer facilement l'output (d'aileur c'est conseille par python d'utiliser subprocess au lieu de os.system :  https://docs.python.org/3/library/subprocess.html ) en faisant 
        completed_process = subprocess.run([
        "free", "-b", "|", 
        "awk", "'FNR == 2 {print $2}'"
        ], capture_output=True)
        
        completed_process.stdout # l'output
        • Partager sur Facebook
        • Partager sur Twitter
          23 octobre 2022 à 21:45:40

          TheSmiley a écrit:

          ou sinon tu peux aussi utilise subprocess qui lui peut capturer facilement l'output (d'aileur c'est conseille par python d'utiliser subprocess au lieu de os.system :  https://docs.python.org/3/library/subprocess.html ) en faisant 

          completed_process = subprocess.run([
          "free", "-b", "|", 
          "awk", "'FNR == 2 {print $2}'"
          ], capture_output=True)
          
          completed_process.stdout # l'output


          Ca ne semble pas fonctionné. Quand je test, voila le résultat :

          >>> import subprocess
          >>> completed_process = subprocess.run(["free", "-b", "|", "awk", "'FNR == 2 {print $2}'"], capture_output=True)
          >>> print(completed_process.stdout)
          b''
          

          Quand je test dans mon code :

          memory = subprocess.run(["free", "-b", "|", "awk", "'FNR == 2 {print $2}'"], capture_output=True)
          print("initialisation memory : ", memory.stdout)

          et que je l'execute, la variable est vide :

          initialisation memory :  b''
          

          Si je retire "stdout" :

          memory = subprocess.run(["free", "-b", "|", "awk", "'FNR == 2 {print $2}'"], capture_output=True)
          print("initialisation memory : ", memory)

          On voit qu'il y a une erreur et affiche l'aide de la commande :

          initialisation memory :  CompletedProcess(args=['free', '-b', '|', 'awk', "'FNR == 2 {print $2}'"], returncode=1, stdout=b'', stderr=b"\nUsage:\n free [options]\n\nOptions:\n -b, --bytes         afficher la sortie en octets\n     --kilo          afficher la sortie en kilooctets\n     --mega          afficher la sortie en m\xc3\xa9gaoctets\n     --giga          afficher la sortie en gigaoctets\n     --tera          afficher la sortie en t\xc3\xa9raoctets\n     --peta          afficher la sortie en p\xc3\xa9taoctets\n -k, --kibi          afficher la sortie en kibioctets\n -m, --mebi          afficher la sortie en m\xc3\xa9bioctets\n -g, --gibi          afficher la sortie en gibioctets\n     --tebi          afficher la sortie en t\xc3\xa9bioctets\n     --pebi          afficher la sortie en p\xc3\xa9bioctets\n -h, --human         afficher la sortie sous forme lisible par un humain\n     --si            utiliser des puissances de 1000 au lieu de 1024\n -l, --lohi          afficher des statistiques d\xc3\xa9taill\xc3\xa9es pour les m\xc3\xa9moires basse et haute\n -t, --total         afficher le total de la RAM + swap\n -s N, --seconds N   r\xc3\xa9p\xc3\xa9ter l'affichage toutes les N secondes\n -c N, --count N     r\xc3\xa9p\xc3\xa9ter l'affichage N fois puis termine\n -w, --wide          sortie large\n\n     --help     afficher cette aide et termine\n -V, --version  affiche les informations de version et termine\n\nPour plus de d\xc3\xa9tails, consultez free(1).\n")
          


          J'ai réussi à avoir un résultat proche de mon souhait en ajoutant le paramètre "shell=true" et en exécutant la commande en 1 seul paramètre :

          memory = subprocess.run(["free -b | awk 'FNR == 2 {print $2}'"], shell=True, capture_output=True)
          print("initialisation memory : ", memory.stdout)

          J'ai juste le "b" et "\n" qui me dérange. Soit j'utilise re.sub, soit quelqu'un a une option plus pratique :

          initialisation memory :  b'4121980928\n'



          Merci.




          -
          Edité par squad13 23 octobre 2022 à 21:48:00

          • Partager sur Facebook
          • Partager sur Twitter
            24 octobre 2022 à 6:12:08

            Salut,

            print("initialisation memory : ", memory.stdout.decode())



            • Partager sur Facebook
            • Partager sur Twitter

            Enregistrer résultat de os.system dans variable

            × 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