421 votes

Comment obtenir l'utilisation actuelle du CPU et de la RAM en Python ?

Quelle est votre méthode préférée pour obtenir l'état actuel du système (CPU actuel, RAM, espace disque libre, etc.) en Python ? Points bonus pour les plateformes *nix et Windows.

D'après mes recherches, il semble y avoir plusieurs façons d'extraire cette information :

  1. En utilisant une bibliothèque telle que PSI (qui semble actuellement ne pas être développé activement et ne pas être supporté sur plusieurs plateformes) ou quelque chose comme pystatgrab (là encore, aucune activité depuis 2007, semble-t-il, et aucun support pour Windows).

  2. L'utilisation d'un code spécifique à la plate-forme, comme l'utilisation d'un os.popen("ps") ou similaire pour les systèmes *nix et MEMORYSTATUS en ctypes.windll.kernel32 (voir cette recette sur ActiveState ) pour la plate-forme Windows. On pourrait créer une classe Python avec tous ces bouts de code.

Ce n'est pas que ces méthodes soient mauvaises, mais existe-t-il déjà un moyen multiplateforme et bien supporté de faire la même chose ?

0 votes

Vous pouvez créer votre propre bibliothèque multiplateforme en utilisant des importations dynamiques : "if sys.platform == 'win32' : import win_sysstatus as sysstatus ; else" ...

1 votes

Ce serait cool d'avoir quelque chose qui fonctionne sur App Engine aussi.

1 votes

L'âge des paquets est-il important ? Si quelqu'un a réussi du premier coup, pourquoi ne le ferait-il pas encore ?

1voto

Jay Points 362

Basé sur le code d'utilisation du processeur par @Hrabal, c'est ce que j'utilise :

from subprocess import Popen, PIPE

def get_cpu_usage():
    ''' Get CPU usage on Linux by reading /proc/stat '''

    sub = Popen(('grep', 'cpu', '/proc/stat'), stdout=PIPE, stderr=PIPE)
    top_vals = [int(val) for val in sub.communicate()[0].split('\n')[0].split[1:5]]

    return (top_vals[0] + top_vals[2]) * 100. /(top_vals[0] + top_vals[2] + top_vals[3])

0voto

CodeFarmer Points 372

Exécuter avec crontab n'imprimera pas le pid

Mise en place : */1 * * * * sh dog.sh cette ligne dans crontab -e

import os
import re

CUT_OFF = 90

def get_cpu_load():
    cmd = "ps -Ao user,uid,comm,pid,pcpu --sort=-pcpu | head -n 2 | tail -1"
    response = os.popen(cmd, 'r').read()
    arr = re.findall(r'\S+', response)
    print(arr)
    needKill = float(arr[-1]) > CUT_OFF
    if needKill:
        r = os.popen(f"kill -9 {arr[-2]}")
        print('kill:', r)

if __name__ == '__main__':
    # Test CPU with 
    # $ stress --cpu 1
    # crontab -e
    # Every 1 min
    # */1 * * * * sh dog.sh
    # ctlr o, ctlr x
    # crontab -l
    print(get_cpu_load())

-12voto

user35952 Points 11

Je ne pense pas qu'il existe une bibliothèque multi-plateforme bien supportée. Rappelez-vous que Python lui-même est écrit en C, donc toute bibliothèque va simplement prendre une décision intelligente quant au bout de code spécifique au système d'exploitation à exécuter, comme vous l'avez suggéré ci-dessus.

1 votes

Psutil peut le faire, et plusieurs combinaisons de déclarations avec la bibliothèque os

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X