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')
>>>
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
Jeune programmeur toujours curieux, venez parler de tout et de rien :)
Salut, deja pour commencer, j'aime bien ton code, et j'avoue, que pour moi sa me donne quelque idée , 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
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....
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)
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
Jeune programmeur toujours curieux, venez parler de tout et de rien :)
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
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
Jeune programmeur toujours curieux, venez parler de tout et de rien :)
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/
First solve the problem. Then, write the code. ~ John Johnson
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..
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.
Blond, bouclé, toujours le sourire aux lèvres...