Partage
  • Partager sur Facebook
  • Partager sur Twitter

écriture de fichier, problème de format

    24 décembre 2016 à 13:04:21

    hello, je suis sur raspberry pi (le 3) et je souhaitais au départ gérer la vitesse d'un ventilo par rapport à l'utilisation du CPU, mais n'ayant pas réussi a faire marcher le port PWM (le 18), je veux simplement faire un fichier log, sous la forme: "DATE-HEURE -> CPU_usage ; CPU_temp ; RAM_usage"

    j'ai donc trouvé des bouts de code, modifé a ma sauce pour arriver à cela, qui marche a la perfection, j'ai toutes les infos , ou presque (bizarrement je n'ai pas le pourcentage d'utilisation du cpu...) sauf que malheur, ce qui est écris dans le fichier ne saute pas de lignes, je vous explique: ma ligne de données inscrite dans le fichier est entourée de parenthèses, ce qui empêche le saut à la ligne...

    voici le code (les print me servent à voir rapidement la sortie) : 

    import os
    import time
    
    # Return CPU temperature as a character string                                      
    def getCPUtemperature():
        res = os.popen('vcgencmd measure_temp').readline()
        return(res.replace("temp=","").replace("'C\n",""))
    
    # Return RAM information (unit=kb) in a list                                        
    # Index 0: total RAM                                                                
    # Index 1: used RAM                                                                 
    # Index 2: free RAM                                                                 
    def getRAMinfo():
        p = os.popen('free')
        i = 0
        while 1:
            i = i + 1
            line = p.readline()
            if i==2:
                return(line.split()[1:4])
    
    # Return % of CPU used by user as a character string                                
    def getCPUuse():
        return(str(os.popen("top -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip(\
    )))
    
    CPU_usage = getCPUuse()
    CPU_temp = getCPUtemperature()
    RAM_usage = getRAMinfo()
    now = time.localtime(time.time())
    now = time.strftime("%d/%m/%Y %H:%M")
    
    System_log = open("System_log.txt", "a")
    log = "\n", now, " -> temp_CPU: ", CPU_temp," ; CPU_usage: ", CPU_usage, "% ; RAM_usage: ", RAM_usage[1], " kb"
    log_output = str(log)
    System_log.write(log_output)
    System_log.close()
    print("done.")
    print(log_output)

    dans la fenetre d'execution, j'ai ceci:

    Python 2.7.9 (default, Sep 17 2016, 20:26:04) 
    [GCC 4.9.2] on linux2
    Type "copyright", "credits" or "license()" for more information.
    >>> ================================ RESTART ================================
    >>> 
    done.
    ('\n', '24/12/2016 12:57', ' -> temp_CPU: ', '41.3', ' ; CPU_usage: ', '', '% ; RAM_usage: ', '783524', ' kb')
    >>> 

    et dans mon fichier..

    ('\n', '24/12/2016 12:42', ' -> temp_CPU: ', '39.7', ' ; CPU_usage: ', '', '% ; RAM_usage: ', ['947732', '594808', '352924'], ' %')('\n', '24/12/2016 12:43', ' -> temp_CPU: ', '39.2', ' ; CPU_usage: ', '', '% ; RAM_usage: ', '599888', ' %')('\n', '24/12/2016 12:45', ' -> temp_CPU: ', '39.7', ' ; CPU_usage: ', '', '% ; RAM_usage: ', '586784', ' %')('\n', '24/12/2016 12:48', ' -> temp_CPU: ', '39.7', ' ; CPU_usage: ', '', '% ; RAM_usage: ', '588792', ' %')('\n', '24/12/2016 12:48', ' -> temp_CPU: ', '39.7', ' ; CPU_usage: ', '', '% ; RAM_usage: ', '589084', ' kb')('\n', '24/12/2016 12:54', ' -> temp_CPU: ', '40.8', ' ; CPU_usage: ', '', '% ; RAM_usage: ', '798880', ' kb')('\n', '24/12/2016 12:57', ' -> temp_CPU: ', '41.3', ' ; CPU_usage: ', '', '% ; RAM_usage: ', '783524', ' kb')

    si vous savez ce qui pourrait m'aider a convertir la variable log_output en caractères, pour avoir les retours a la ligne etc, je vous en remercie d'avance :3

    PS: la variable log_ouput est là juste parce que la variable log seule me revoie une erreur si je veux l'écrire dans mon fichier

    Merci, cordialement, Antoine

    • Partager sur Facebook
    • Partager sur Twitter
    Jeune programmeur toujours curieux, venez parler de tout et de rien :)
      24 décembre 2016 à 13:50:38

      Salut, deja pour commencer, j'aime bien ton code, et j'avoue, que pour moi sa me donne quelque idée :lol:, merci

      Sinon pour ton probleme, alors, As tu executé le code plusieurs fois? et une autre as tu lu le fichier txt en entier ?

      Car si tu regardes bien tu las executé a 12:57 et 12:42, peut etre pensais tu as le voir apparaitre sur une deuxieme ligne ?

      Car ton \n est lu comme du texte et donc n'a pas son effet de saut de ligne.

      Tante de supprimé le fichier txt, et de relancer ton code Py, puis relire ce qu'il y a dedans, et comparer. sinon je tu codes en Python3 mais ton interpreteur est en 2.7

      • Partager sur Facebook
      • Partager sur Twitter
      ptit développeur en python principalement
        24 décembre 2016 à 14:11:34

        j'avais ecris un message mais je ne peux pas publier de nouveau message avant 24h... donc voici les deux, le dernier en noir et l'ancien, incorrect, en gris

        ok, donc j'ai bien suprimé RAM_usage, j'ai rajouté un print me permettant de tester l'existence de CPU_usage et largement simplifié l'écriture dans le fichier:

        # -*- coding: utf-8 -*-
        import os
        import time
        
        # Return CPU temperature as a character string                                      
        def getCPUtemperature():
            res = os.popen('vcgencmd measure_temp').readline()
            return(res.replace("temp=","").replace("'C\n",""))
        
        # Return % of CPU used by user as a character string                                
        def getCPUuse():
            return(str(os.popen("top -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip(\
        )))
        
        CPU_usage = getCPUuse()
        CPU_temp = getCPUtemperature()
        now = time.localtime(time.time())
        now = time.strftime("%d/%m/%Y %H:%M")
        
        System_log = open("System_log.txt", "a")
        log = ""+now+" -> temp_CPU: "+CPU_temp+" ; CPU_usage: "+CPU_usage+"% "
        System_log.write("\n"+log)
        System_log.close()
        print("done.")
        print(log)
        print("-->"+CPU_usage+"<--") #si pas d'espace entre les flèches = pas de variable CPU_usage 
        

        le pb, c'est que tjrs pas de valeur à CPU_usage....

        /////////////////////////////////////////////////////////////////////////////////

        Super, merci :)

        oui plusieurs fois comme en témoignent toutes les "phrases" les unes au bout des autres :')

        oui il n'est pas considéré comme un saut de ligne mais du texte, j'ai en effet essayé de suprimer le texte dans le fichier log, rien ne change.

        tiens, je viens de modifier le programme, et au final, le pb était que j'ai confondu deux langages, et j'ai mis des virgules (signe de séparation de parametres pour une fonction sous python) au lieu de + ! donc maintenant c'est niquel, je peux encore optimiser le programme mais maintenant il me manque le pourcentage d'utilisation CPU qui ne s'affiche pas:

        le code: 

        import os import time # Return CPU temperature as a character string def getCPUtemperature(): res = os.popen('vcgencmd measure_temp').readline() return(res.replace("temp=","").replace("'C\n","")) # Return RAM information (unit=kb) in a list # Index 0: total RAM # Index 1: used RAM # Index 2: free RAM def getRAMinfo(): p = os.popen('free') i = 0 while 1: i = i + 1 line = p.readline() if i==2: return(line.split()[1:4]) # Return % of CPU used by user as a character string def getCPUuse(): return(str(os.popen("top -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip(\ ))) CPU_usage = getCPUuse() CPU_temp = getCPUtemperature() RAM_usage = getRAMinfo() now = time.localtime(time.time()) now = time.strftime("%d/%m/%Y %H:%M") System_log = open("System_log.txt", "a") log = ""+now+" -> temp_CPU: "+CPU_temp+" ; CPU_usage: "+CPU_usage+"% ; RAM_usage: "+RAM_usage[1]+" kb" log_output = str(log) System_log.write("\n"+log_output) System_log.close() print("done.") print(log_output)

        l'exec (jsp comment mettre a jour, j'ai essayé un sudo apt-get upgrade python3-pip

        Python 2.7.9 (default, Sep 17 2016, 20:26:04) [GCC 4.9.2] on linux2 Type "copyright", "credits" or "license()" for more information. >>> ================================ RESTART ================================ >>> done. 24/12/2016 14:04 -> temp_CPU: 37.6 ; CPU_usage: % ; RAM_usage: 910904 kb >>> ================================ RESTART ================================ >>> 

        et le nouveau fichier: ( on peux voir que les deux premières lignes sont mauvaises, et qu'après le pb est resolu)

        ('\n', '24/12/2016 14:01', ' -> temp_CPU: ', '41.3', ' ; CPU_usage: ', '', '% ; RAM_usage: ', '880656', ' kb') ('', '24/12/2016 14:02', ' -> temp_CPU: ', '39.2', ' ; CPU_usage: ', '', '% ; RAM_usage: ', '920244', ' kb') 24/12/2016 14:04 -> temp_CPU: 37.6 ; CPU_usage: % ; RAM_usage: 910904 kb 24/12/2016 14:07 -> temp_CPU: 38.6 ; CPU_usage: % ; RAM_usage: 919720 kb


        donc j'ai pas reussi a mettre a jour vers python 3 l'executeur xD

        ->>> donc last but not least, le CPU_usage en % qui ne s'affiche pas, l'objectif après de se programme est de le faire écrire cette ligne toutes les minutes pendant une heure, premièrement dans sa boîte officielle puis avec le ventilo dans un fichier separer, j'aurais préféré un fichier c

        alc mais bon c'est deja bien ça

        EDIT: je pense enlever RAM_usage, inutile, vu que c'est calculé au même moment que le reste, l'utilisation est plus intense que la normale, alors que le CPU lui n'est pas utilisé lors du calcul (le cpu reste en dessous de 3% mais la ram utilisé est de 900000kb, le max étant de 1000000...)

        -
        Edité par CAntoine52190 24 décembre 2016 à 14:31:08

        • Partager sur Facebook
        • Partager sur Twitter
        Jeune programmeur toujours curieux, venez parler de tout et de rien :)
          24 décembre 2016 à 14:59:32

          log = {
                  "date": now,
                  "temp_cpu": CPU_temp,
                  "cpu_usage": CPU_usage+"%",
                  "ram_usage": RAM_usage[1]+"kb"}

          with open("file.txt","a") as file:
                  file.write(str(log))

          Que penses tu de sa, apres tu peux appeler example, print("date") et la tu aurais ta valeur dans CPU_temp, enfin apres a toi de voir, puis with open pour la faciliter d'usage










          • Partager sur Facebook
          • Partager sur Twitter
          ptit développeur en python principalement
            24 décembre 2016 à 15:34:16

            Oui mais nan, ici ton programme demande a déclarer une fois en plus tt les variables, de plus il faut redefinir la date, je t'avoue que pour le write j'aime bien, mais comme je l'execute plusieurs fois il faut refermer le fichier, voici la code qui marche en ce moment-meme, la seule chose qu'il manque c'est.... le CPU_usage ,qui n'a tjrs pas de valeure :/

            # -*- coding: utf-8 -*-
            import os
            import time
            
            # Return CPU temperature as a character string                                      
            def getCPUtemperature():
                res = os.popen('vcgencmd measure_temp').readline()
                return(res.replace("temp=","").replace("'C\n",""))
            
            # Return % of CPU used by user as a character string                                
            def getCPUse():
                return(str(os.popen("top -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip(\
            )))
            
            n=0
            
            while n<60:
                CPU_usage = getCPUse()
                CPU_temp = getCPUtemperature()
                now = time.localtime(time.time())
                now = time.strftime("%d/%m/%Y %H:%M")
                System_log = open("System_log.txt", "a")
                log = ""+now+" -> temp_CPU: "+CPU_temp+" ; CPU_usage: "+CPU_usage+"% "
                System_log.write("\n"+log)
                System_log.close()
                time.sleep(30)
                print(str(n+1)+") "+log)
                n=n+1
            print("finished")

            ici on prend des valeurs toutes les 30 secondes pendant un total de 30 minutes... donc 60 fois, on les écris dans le fichier, et en temps réel sur le moniteur

            -
            Edité par CAntoine52190 24 décembre 2016 à 15:36:13

            • Partager sur Facebook
            • Partager sur Twitter
            Jeune programmeur toujours curieux, venez parler de tout et de rien :)
              24 décembre 2016 à 15:47:56

              A oui, ok je pensais que tu voudrais récupérer les variables, dans le fichier txt, sinon CPU_usage fonctionne chez moi
              • Partager sur Facebook
              • Partager sur Twitter
              ptit développeur en python principalement
                24 décembre 2016 à 15:57:41

                ah :/ bon si ça marche tant mieux, mais je vois pas pk moi j'ai rien :/
                • Partager sur Facebook
                • Partager sur Twitter
                Jeune programmeur toujours curieux, venez parler de tout et de rien :)
                  24 décembre 2016 à 16:11:35

                  Chez moi la commande

                  top -n1 | awk '/Cpu\(s\):/ {print $2}'

                  Ne renvoie rien, donc ça vient peut-être pas de ton code Python.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Blond, bouclé, toujours le sourire aux lèvres...

                    24 décembre 2016 à 17:20:42

                    Bonjour,

                    faire un appel système pour lancer top et récupérer des données ça prend du temps cpu qui est compté dans les données … cela fausse le rapport. Il vaudrait peut-être mieux utiliser une bibliothèque externe pour ça → http://pythonhosted.org/psutil/

                    • Partager sur Facebook
                    • Partager sur Twitter
                    First solve the problem. Then, write the code. ~ John Johnson
                      24 décembre 2016 à 17:25:50

                      Alors chez moi la commande, me retourne 0,3, mais par contre sa correspond au temps de processeur utilisé dans l'espace utilisateur, donc je sais pas si pour toi sa serait revelateur, ou peut etre faudrait til prendre toute les variables de top..

                      • Partager sur Facebook
                      • Partager sur Twitter
                      ptit développeur en python principalement

                      écriture de fichier, problème de format

                      × 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