2011-01-30 137 views
15

utilizar Python ¿hay alguna manera de averiguar la información del procesador ... (Necesito el nombre)Obtener información del procesador en Python

necesito el nombre del procesador que el intérprete está ejecutando. Revisé el módulo sys pero no tiene esa función.

Puedo usar una biblioteca externa también si es necesario.

Respuesta

21

La función platform.processor() devuelve el nombre del procesador como una cadena.

>>> import platform 
>>> platform.processor() 
'Intel64 Family 6 Model 23 Stepping 6, GenuineIntel' 
+2

alguien puede decir si esta es la salida independiente de la plataforma. es decir. ¿siempre da la misma salida exacta para la misma CPU en Windows/Linux/osx? –

+2

Devuelve una cadena vacía en mi sistema (Python 2.6.5 en Ubuntu) ... – Spacedman

+0

@gnibbler: ¿Hay alguna razón para dudar de que la salida puede variar? Aunque espero que alguien pueda confirmarlo. – user225312

6

Hay algo de código aquí:

http://www.koders.com/python/fidB436B8043AA994C550C0961247DACC3E04E84734.aspx?s=mdef%3Apython

su misma OS-dependiente, por lo que hay un montón de si-ramas. Pero resuelve todas las capacidades de la CPU.

$ python cpuinfo.py 
CPU information: getNCPUs=2 has_mmx has_sse has_sse2 is_64bit is_Intel is_Pentium is_PentiumIV 

Para linux se ve en/proc/cpuinfo e intenta usar uname. Para Windows, parece que usa el registro.

Para obtener la [primera] nombre del procesador que utiliza este módulo:

>>> import cpuinfo 
>>> cpuinfo.cpu.info[0]['model name'] 
'Intel(R) Pentium(R) 4 CPU 3.60GHz' 

Si se ha hecho más de un procesador, entonces los elementos de cpuinfo.cpu.info tendrá sus nombres. No creo que haya visto una PC con dos procesadores diferentes (desde los años 80, cuando se podía obtener un coprocesador Z80 para tu 6502 CPU BBC Micro ...)

+0

Lo siento, necesitaba el nombre, debería haber mencionado – user225312

+0

Cómo obtener el nombre agregado. – Spacedman

+5

El enlace parece estar roto y buscar cpuinfo en ese sitio web trae muchos resultados. podría poner el nombre del proyecto/un enlace al código –

5

Aquí hay un trozo de hackeo de código que debe encontrar constantemente el nombre del procesador en las tres plataformas en las que tengo alguna experiencia razonable.

import os, platform, subprocess, re 

def get_processor_name(): 
    if platform.system() == "Windows": 
     return platform.processor() 
    elif platform.system() == "Darwin": 
     os.environ['PATH'] = os.environ['PATH'] + os.pathsep + '/usr/sbin' 
     command ="sysctl -n machdep.cpu.brand_string" 
     return subprocess.check_output(command).strip() 
    elif platform.system() == "Linux": 
     command = "cat /proc/cpuinfo" 
     all_info = subprocess.check_output(command, shell=True).strip() 
     for line in all_info.split("\n"): 
      if "model name" in line: 
       return re.sub(".*model name.*:", "", line,1) 
    return "" 
+1

¿Por qué importar dos veces el sistema operativo? – wings

+2

Gracias, @wings: he eliminado la importación adicional. – dbn

4

código de trabajo (quiero saber si esto no funciona para usted):

import platform, subprocess 

def get_processor_info(): 
    if platform.system() == "Windows": 
     return platform.processor() 
    elif platform.system() == "Darwin": 
     return subprocess.check_output(['/usr/sbin/sysctl', "-n", "machdep.cpu.brand_string"]).strip() 
    elif platform.system() == "Linux": 
     command = "cat /proc/cpuinfo" 
     return subprocess.check_output(command, shell=True).strip() 
    return "" 
+0

En python3 'subprocess' no devolverá un' str' sino un 'byte'. Tienes que convertirlo en un 'str' con' your_byte.decode ('utf-8') '. Por ejemplo, para Darwin el código sería 'model = subprocess.check_output (["/usr/sbin/sysctl "," -n "," machdep.cpu.brand_string "]). Strip(); devuelve model.decode ('utf-8') '. – lenooh

1

El si-casos para Windows es decir platform.processor() solo da la descripción o nombre de la familia el procesador, por ejemplo Intel64 Family 6 Model 60 Stepping 3.

I utilizados:

if platform.system() == "Windows": 
     family = platform.processor() 
     name = subprocess.check_output(["wmic","cpu","get", "name"]).strip().split("\n")[1] 
     return ' '.join([name, family]) 

para obtener el modelo real de la CPU que es el la misma salida que la FI-bloques para Darwin y Linux, por ejemplo, Intel (R) Core (TM) CPU i7-4790K @ 4.00GHz Intel64 Family 6 Model 60 Stepping 3, GenuineIntel

1

Parece que el guión que falta en respuesta @Spacedman está aquí:

https://github.com/pydata/numexpr/blob/master/numexpr/cpuinfo.py

Está parcheado para trabajar con Python 3.

>python cpuinfo.py 
CPU information: CPUInfoBase__get_nbits=32 getNCPUs=2 has_mmx is_32bit is_Intel is_i686 

La estructura de los datos es de hecho OS-dependiente, en Windows se parezca a esto:

>python -c "import cpuinfo, pprint; pprint.pprint(cpuinfo.cpu.info[0])" 
{'Component Information': '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00', 
'Configuration Data': '\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00', 
'Family': 6, 
'FeatureSet': 2687451135L, 
'Identifier': u'x86 Family 6 Model 23 Stepping 10', 
'Model': 23, 
'Platform ID': 128, 
'Previous Update Signature': '\x00\x00\x00\x00\x0c\n\x00\x00', 
'Processor': '0', 
'ProcessorNameString': u'Intel(R) Core(TM)2 Duo CPU  P8600 @ 2.40GHz', 
'Stepping': 10, 
'Update Signature': '\x00\x00\x00\x00\x0c\n\x00\x00', 
'Update Status': 2, 
'VendorIdentifier': u'GenuineIntel', 
'~MHz': 2394} 

En Linux es diferente:

# python -c "import cpuinfo, pprint; pprint.pprint(cpuinfo.cpu.info[0])" 
{'address sizes': '36 bits physical, 48 bits virtual', 
'apicid': '0', 
'bogomips': '6424.11', 
'bugs': '', 
'cache size': '2048 KB', 
'cache_alignment': '128', 
'clflush size': '64', 
'core id': '0', 
'cpu MHz': '2800.000', 
'cpu cores': '2', 
'cpu family': '15', 
'cpuid level': '6', 
'flags': 'fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm const 
ant_tsc pebs bts nopl pni dtes64 monitor ds_cpl est cid cx16 xtpr pdcm lahf_lm', 
'fpu': 'yes', 
'fpu_exception': 'yes', 
'initial apicid': '0', 
'microcode': '0xb', 
'model': '6', 
'model name': 'Intel(R) Pentium(R) D CPU 3.20GHz', 
'physical id': '0', 
'power management': '', 
'processor': '0', 
'siblings': '2', 
'stepping': '5', 
'uname_m': 'x86_64', 
'vendor_id': 'GenuineIntel', 
'wp': 'yes'} 
0

He probado varias soluciones aquí . cat /proc/cpuinf da una gran cantidad de salida para una máquina multinúcleo, muchas páginas de largo, platform.processor() parece que le da muy poco. Utilizando Linux y Python 3, a continuación se muestra un resumen bastante útil de unas veinte líneas:

import subprocess 
print((subprocess.check_output("lscpu", shell=True).strip()).decode()) 
Cuestiones relacionadas