Utiliser Python est-il un moyen de trouver les informations sur le processeur ... (j'ai besoin du nom)
J'ai besoin du nom du processeur sur lequel l'interpréteur s'exécute. J'ai vérifié le module système mais il n'a pas cette fonction.
Je peux aussi utiliser une bibliothèque externe si nécessaire.
La fonction platform.processor () renvoie le nom du processeur sous forme de chaîne.
>>> import platform
>>> platform.processor()
'Intel64 Family 6 Model 23 Stepping 6, GenuineIntel'
Il y a du code ici:
https://github.com/pydata/numexpr/blob/master/numexpr/cpuinfo.py
il est très dépendant du système d'exploitation, donc il y a beaucoup de if-branches. Mais cela fonctionne sur toutes les capacités du processeur.
$ python cpuinfo.py
CPU information: getNCPUs=2 has_mmx has_sse has_sse2 is_64bit is_Intel is_Pentium is_PentiumIV
Pour Linux, il cherche dans/proc/cpuinfo et essaie d’utiliser uname. Pour Windows, il semble qu'il utilise le registre.
Pour obtenir le [premier] nom du processeur à l'aide de ce module:
>>> import cpuinfo
>>> cpuinfo.cpu.info[0]['model name']
'Intel(R) Pentium(R) 4 CPU 3.60GHz'
Si cela a plus d'un processeur, alors les éléments de cpuinfo.cpu.info auront leur nom. Cependant, je ne pense pas avoir jamais vu un PC doté de deux processeurs différents (pas depuis les années 80 où vous avez pu obtenir un co-processeur Z80 pour votre processeur 6502 BBC Micro ...)
Voici un morceau de code bidon qui devrait systématiquement rechercher le nom du processeur sur les trois plates-formes pour lesquelles j'ai une expérience raisonnable.
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 ""
J'ai essayé différentes solutions ici. cat /proc/cpuinf
donne une quantité énorme de sortie pour une machine multicœur, plusieurs pages, platform.processor()
semble vous en donner très peu. Sous Linux et Python 3, voici un résumé assez utile d’une vingtaine de lignes:
import subprocess
print((subprocess.check_output("lscpu", Shell=True).strip()).decode())
Code de travail (laissez-moi savoir si cela ne fonctionne pas pour vous):
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 ""
Pour un package facile à utiliser, vous pouvez utiliser cpuinfo
.
Installer en tant que pip install py-cpuinfo
Utiliser depuis la ligne de commande: python -m cpuinfo
Code:
import cpuinfo
cpuinfo.get_cpu_info()['brand']
Les if-cases pour Windows i.e platform.processor () donnent simplement la description ou le nom de famille du processeur, par exemple Intel64 Family 6 Model 60 Stepping 3.
J'ai utilisé:
if platform.system() == "Windows":
family = platform.processor()
name = subprocess.check_output(["wmic","cpu","get", "name"]).strip().split("\n")[1]
return ' '.join([name, family])
pour obtenir le modèle de processeur réel qui correspond à la même sortie que les if-blocks pour Darwin et Linux, par ex. Processeur Intel® Core (TM) i7-4790K à 4.00GHz Intel64 Famille 6 Modèle 60 Stepping 3, GenuineIntel
On dirait que le script manquant dans la réponse de @Spacedman est ici:
https://github.com/pydata/numexpr/blob/master/numexpr/cpuinfo.py
Il est corrigé pour fonctionner avec Python 3.
>python cpuinfo.py
CPU information: CPUInfoBase__get_nbits=32 getNCPUs=2 has_mmx is_32bit is_Intel is_i686
La structure des données dépend en effet du système d'exploitation. Sous Windows, elle ressemble à ceci:
>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}
Sous Linux, c'est différent:
# 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'}
Pour Linux et la compatibilité ascendante avec Python (tout le monde n’a pas cpuinfo
), vous pouvez analyser directement /proc/cpuinfo
. Pour obtenir la vitesse du processeur, essayez:
# Take any float trailing "MHz", some whitespace, and a colon.
speeds = re.search("MHz\s*: (\d+\.?\d*)", cpuinfo_content)
Notez l'utilisation nécessaire de \s
pour les espaces blancs .../proc/cpuinfo
contient en fait des caractères de tabulation et j'ai travaillé dur pendant des heures à travailler avec sed
jusqu'à ce que je trouve:
sed -rn 's/cpu MHz[ \t]*: ([0-9]+\.?[0-9]*)/\1/gp' /proc/cpuinfo
Il me manquait le \t
et cela me rendait folle parce que je ne correspondais plus au fichier ou rien.
Essayez des expressions régulières similaires pour les autres champs dont vous avez besoin:
# Take any string after the specified field name and colon.
re.search("field name\s*: (.+)", cpuinfo_content)