2009-01-21 32 views
24

Usando Python, ¿cómo se puede devolver información como uso de CPU, uso de memoria (gratis, usado, etc.), conteo de procesos, etc. de manera genérica para que el mismo código pueda ejecutarse en Linux, Windows, BSD, etc.?¿Cómo puedo devolver la información del sistema en Python?

Como alternativa, ¿cómo podría devolverse esta información en todos los sistemas anteriores con el código específico de ese sistema operativo que se ejecuta solo si ese sistema operativo es realmente el entorno operativo?

+2

instalación de pip psutil – meawoppl

Respuesta

17

Respecto de multiplataforma: la mejor opción es escribir código específico de la plataforma y luego importarlo condicionalmente. p.ej.

import sys 
if sys.platform == 'win32': 
    import win32_sysinfo as sysinfo 
elif sys.platform == 'darwin': 
    import mac_sysinfo as sysinfo 
elif 'linux' in sys.platform: 
    import linux_sysinfo as sysinfo 
#etc 

print 'Memory available:', sysinfo.memory_available() 

Para recursos específicos, como señala Anthony puede acceder /proc bajo Linux. Para Windows, podría tener un poke alrededor del Microsoft Script Repository. No estoy seguro de dónde obtener ese tipo de información en los Macs, pero puedo pensar en un gran sitio web donde se puede pedir :-)

+5

+1: Cada sistema operativo * es * diferente. Algunos conceptos no se asignan. No puede hacerse agnóstico del sistema operativo. Debe ser polimórfico con una implementación única para cada sistema operativo. –

+1

Estoy de acuerdo en que esta es probablemente la mejor manera. He creado 2 nuevas preguntas para los detalles de OS X/Windows. http://stackoverflow.com/questions/467600/how-can-i-read-system-information-in-python-on-os-x y http://stackoverflow.com/questions/467602/how-can- i-read-system-information-in-python-on-windows – DavidM

1

Parece que desea obtener mucha más información que la que ofrece la biblioteca estándar de Python. Si yo fuera tú, descargaría el código fuente de 'ps' o 'top', o la versión de Gnome/KDE del mismo, o cualquier número de programas de monitoreo/gráficos del sistema que tengan más probabilidades de tener todo el cruce de Unix necesario bits de plataforma, ver lo que hacen y luego realizar las llamadas nativas necesarias con ctypes.

Es trivial detectar la plataforma. Por ejemplo, con ctypes puede intentar cargar libc.so, si eso arroja una excepción intente cargar 'msvcrt.dll', etc. Sin mencionar simplemente verificar el nombre del sistema operativo con os.name. A continuación, solo delegue llamadas a su nueva API multiplataforma a la implementación específica de la plataforma (lo siento).

Cuando haya terminado, no olvide cargar el paquete resultante en pypi.

5

En un entorno Linux, puede leer desde el sistema de archivos/proc.

~$ cat /proc/meminfo 
MemTotal:  2076816 kB 
MemFree:  130284 kB 
Buffers:  192664 kB 
Cached:  1482760 kB 
SwapCached:   0 kB 
Active:   206584 kB 
Inactive:  1528608 kB 
HighTotal:  1179484 kB 
HighFree:  120768 kB 
LowTotal:  897332 kB 
LowFree:   9516 kB 
SwapTotal:  2650684 kB 
SwapFree:  2650632 kB 
Dirty:    64 kB 
Writeback:   12 kB 
AnonPages:  59668 kB 
Mapped:   22008 kB 
Slab:   200744 kB 
PageTables:  1220 kB 
NFS_Unstable:  0 kB 
Bounce:    0 kB 
CommitLimit: 3689092 kB 
Committed_AS: 263892 kB 
VmallocTotal: 114680 kB 
VmallocUsed:  3604 kB 
VmallocChunk: 110752 kB 
0

Hay el proyecto PSI (Python Información del sistema) con ese fin, pero no lo hacen cubrir Windows todavía.

Probablemente pueda utilizar PSI y recpies like this one y crear una biblioteca básica que satisfaga sus necesidades.

2

psutil debe proporcionar lo que necesita:

[.. .] biblioteca multiplataforma para recuperar información sobre procesos en ejecución y utilización del sistema (CPU, memoria, discos, red) [...]

[...] admite Linux, Windows, OSX, FreeBSD y Sun Solaris, ambas arquitecturas de 32 bits y 64 bits [...]

Cuestiones relacionadas