CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

"IndexError: list index out of range" sur python :c

Ulysse21_jvc
Ulysse21_jvc
Niveau 3
04 janvier 2020 à 11:43:20

Salut j'essaye de faire un écran de monitoring avec un arduino pour mon pc. J'ai vue pas mal de gens le faire sur YouTube et il y'en a un qui me plait mais le programme en python coté pc marche pas :snif:
Si quelqu'un sais pourquoi ça serait sympa

import serial
import time
import wmi
import math

global w
w = wmi.WMI(namespace="root\OpenHardwareMonitor")


global cpu
global gpu
global ram


def getRamSize():
    used = 0
    free = 0
    hw_infos = w.Sensor()
    for sensor in hw_infos:
        if sensor.SensorType==u'Data':
            if sensor.Name == u'Used Memory':
                used = int(math.ceil(sensor.Value))
            elif sensor.Name == u'Available Memory':
                free = int(math.ceil(sensor.Value))
    return used + free


def updateHWData():
    global w
    global cpu
    global gpu
    global ram
    hw_infos = w.Sensor()
    cpu = [] 
    gpu = [] 
    ram = ["RAM total: 16GB "]
    
    for sensor in hw_infos:
        #print (sensor.SensorType)
        #print(sensor.Name)
        #print(sensor.Value)
        
        if sensor.SensorType==u'Temperature':
            if sensor.Name == u'CPU Package':
                cpu.insert(0,  "CPU temp: %dC   " % sensor.Value)
            elif sensor.Name == u'GPU Core':
                gpu.insert(0,  "GPU temp: %dC    " % sensor.Value)
                
        if sensor.SensorType==u'Clock':
            if sensor.Name == u'CPU Core #1':
                cpu.insert(1,  "CPU clk: %dMHz" % sensor.Value)
            elif sensor.Name == u'GPU Core':
                gpu.insert(1,  "GPU clk: %dMHz    " % sensor.Value)
        
        if sensor.SensorType==u'Data':
            if sensor.Name == u'Used Memory':
                ram.insert(1,  "RAM used: %.1fGB  " % sensor.Value)
    

def serial_ports():
    ports = ['COM%s' % (i + 1) for i in range(256)]
    result = []
    for port in ports:
        try:
            s = serial.Serial(port)
            s.close()
            result.append(port)
        except (OSError, serial.SerialException):
            pass
    return result

arduino = serial.Serial(serial_ports()[1], 9600, timeout=.7)
time.sleep(2)

arduino.write("Waiting for     Open HW Monitor ".encode())
time.sleep(0.5)

while len(w.Sensor()) < 1:
    time.sleep(1)

cpu = [] 
gpu = []
ram = ["RAM total: {:2d}GB ".format(getRamSize())]

    
while True:
    #startTime = int(round(time.time() * 1000))
    
    for i in range(4):
        updateHWData()
        arduino.write(cpu[0].encode())
        time.sleep(0.2)
        arduino.write(gpu[0].encode())
        time.sleep(2)
    updateHWData()
    arduino.write(cpu[1].encode())
    time.sleep(0.2)
    arduino.write(gpu[1].encode())
    time.sleep(2)
    updateHWData()
    arduino.write(ram[0].encode())
    time.sleep(0.2)
    arduino.write(ram[1].encode())
    time.sleep(2)

    #print ("estimated time: ", int(round(time.time() * 1000)) - startTime)

Erreur :
Traceback (most recent call last):
File "C:\Users\Ulysse\Desktop\16x2Projekt\main.py", line 91, in <module>
arduino.write(cpu[0].encode())
IndexError: list index out of range

Message édité le 04 janvier 2020 à 11:47:33 par Ulysse21_jvc
Grimmys
Grimmys
Niveau 19
04 janvier 2020 à 12:19:39

Bonjour,

Fout des print partout un peu comme tu as essayé de le faire.

Vraisemblablement, cpu est vide même après l'update.

Faudrait vérifier où se trouve le problème (w est vide ? Sensor est vide ?).

Et je sais pas si c'est toi qui a écrit ce programme, mais l'usage à outrance de " global " c'est vraiment dégueulasse...... Plutôt que de faire des global, tu pourrais utiliser des paramètres de fonction par exemple... C'est impossible à suivre là. :(

Ulysse21_jvc
Ulysse21_jvc
Niveau 3
04 janvier 2020 à 12:42:29

Merci pour ta réponse. C'est pas moi qui est écrit le code je l'ai repris d'une vidéo
https://www.youtube.com/watch?v=UM7p-_zyT38
J'ai effectivement un peu près compris que la valeur cpu est vide. Enfaîte le script va avec le logiciel Open Hardware monitor donc depuis openhw à peut-être changer ?
Je mis connais pas du tout en python aussi :honte:

Ulysse21_jvc
Ulysse21_jvc
Niveau 3
04 janvier 2020 à 12:49:00

Et j'ai complètement oublié de le dire mais si j’enlève les deux cpu encode
(arduino.write(cpu[0].encode()), arduino.write(cpu[1].encode()))
Le programme se lance niquel et prend bien les bonnes valeurs de openhw. Même l'arduino reçoit les données et l'affiche.
Pourtant le code pour la temp et la vitesse du cpu est quasi identique à celle du gpu et de la ram non ? :doute:

Ulysse21_jvc
Ulysse21_jvc
Niveau 3
04 janvier 2020 à 13:37:50
https://www.youtube.com/watch?v=tUdwNxBho2E

Effectivement la valeur cpu est vide :ouch:

Grimmys
Grimmys
Niveau 19
04 janvier 2020 à 14:25:31

Bien, du coup faut remonter plus haut.

Techniquement la fonction updateHWData devrait remplir correctement cpu, ceci en se basant sur les valeurs de " sensors ", a priori le problème c'est qu'aucune sensor n'est récupérée donc, reste à voir pourquoi... :hap:

Juste en dessous de " hw_infos = w.Sensor() ", écrit " print(hw_infos)", normalement ça devrait être un itérable vide. :(

Ulysse21_jvc
Ulysse21_jvc
Niveau 3
04 janvier 2020 à 14:42:31

Tout est résolu. Enfaîte OpenHW n'affiche tout simplement pas les températures de mon cpu :hum:
J'ai du coup testé avec le cpu usage qui lui est bien présent et.. ça marche :oui:

if sensor.SensorType==u'Load':
            if sensor.Name == u'CPU Total':
                cpu.insert(0,  "CPU usage: %d   " % sensor.Value)     

Et pour l'arduino j'ai juste mis ça :

updateHWData()
    time.sleep(0.2)
    arduino.write(cpu[0].encode())
    time.sleep(1)
    updateHWData()

Résultat :

https://image.noelshack.com/fichiers/2020/01/6/1578144999-20200104-142656.jpg

https://www.youtube.com/watch?v=m2f-x-I2j7A

Il me reste plus qu'a remplir les écrans avec d'autres infos
Merci pour ton aide

Ulysse21_jvc
Ulysse21_jvc
Niveau 3
04 janvier 2020 à 14:45:55

https://image.noelshack.com/fichiers/2020/01/6/1578145425-capture.png

C'est très étrange et aucune infos et disponible sur ma carte mère.
Pourtant CPUID HWMonitor lui me les affiches

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment