2011-01-30 14 views
15

Korzystanie Python jest jakiś sposób, aby dowiedzieć się informacji procesora ... (muszę nazwy)Uzyskiwanie informacji procesor w Pythonie

muszę nazwę procesora że interpreter jest uruchomiony. Sprawdziłem moduł sys, ale nie ma takiej funkcji.

Mogę również użyć biblioteki zewnętrznej, jeśli jest to wymagane.

Odpowiedz

21

Funkcja platform.processor() zwraca nazwę procesora jako ciąg.

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

Czy ktoś może powiedzieć, czy jest to niezależne od platformy wyjście. to znaczy. czy zawsze daje dokładnie takie samo wyjście dla tego samego procesora w systemie Windows/Linux/Osx? –

+2

Zwraca pusty ciąg znaków w moim systemie (python 2.6.5 w systemie Ubuntu) ... – Spacedman

+0

@gnibbler: Czy istnieje powód, aby wątpić, że dane wyjściowe mogą się różnić? Chociaż mam nadzieję, że ktoś może potwierdzić. – user225312

6

Jest jakiś kod tutaj:

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

jego bardzo OS-zależne, więc istnieje wiele IF-oddziałów. Ale działa to na wszystkich możliwościach procesora.

Dla systemu Linux wygląda w/proc/cpuinfo i próbuje użyć uname. W przypadku systemu Windows wygląda na to, że używa rejestru.

Aby uzyskać [pierwszy] nazwę procesora przy użyciu tego modułu:

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

Jeśli jego dostał więcej niż jeden procesor, a następnie elementy cpuinfo.cpu.info będą miały swoje nazwy. Nie sądzę, żebym kiedykolwiek widział komputer z dwoma różnymi procesorami (nie od lat 80-tych, kiedy można było uzyskać koprocesor Z80 dla procesora BBC Micro 6502).

+0

Przepraszam, że potrzebowałem tego imienia, powinienem był wspomnieć – user225312

+0

Jak uzyskać nazwę dodaną. – Spacedman

+5

Link wydaje się zepsuty, a wyszukiwanie cpuinfo na tej stronie przynosi wiele wyników. czy mógłbyś podać nazwę projektu/link do kodu –

5

Oto trochę hackerski kod, który powinien konsekwentnie znajdować nazwę procesora na trzech platformach, które mam jakiekolwiek rozsądne doświadczenie.

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

Dlaczego importowanie os dwa razy? – wings

+2

Dzięki, @wings - usunąłem dodatkowy import. – dbn

4

kod Praca (daj mi znać, jeśli to nie działa dla ciebie):

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

W python3 'subprocess' nie zwróci' str', ale '' byte'. Musisz go przekonwertować na 'str' z' twoim_byte.decode ('utf-8') '. Na przykład dla Darwina kod będzie miał postać "model = subprocess.check_output (["/usr/sbin/sysctl "," -n "," machdep.cpu.brand_string "]). Strip(); return model.decode ('utf-8') '. – lenooh

1

IF-przypadki dla Windows czyli platform.processor() po prostu daje opis lub rodziny nazwę procesor np Intel64 Family 6 model 60 Stepping 3.

użyłem:

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

uzyskać rzeczywisty model procesora, która jest taka sama moc jak If-bloków dla Darwina i Linux, na przykład Intel (R) Core (TM) i7-4790K CPU @ 4.00GHz Intel64 Family 6 model 60 Stepping 3, GenuineIntel

1

Wygląda brakującego skryptu w odpowiedzi @Spacedman jest tutaj:

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

Jest łatany do pracy z Pythonem 3.

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

Struktura danych jest rzeczywiście OS zależne w systemie Windows wygląda to tak:

>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} 

W systemie Linux jest inaczej:

# 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

Starałem się różne rozwiązania tutaj . cat /proc/cpuinf daje ogromną ilość danych wyjściowych dla maszyny wielordzeniowej, wiele stron, platform.processor() wydaje się bardzo mało. Używając Linuxa i Pythona 3, poniższe zwraca całkiem przydatne podsumowanie około dwudziestu linii:

import subprocess 
print((subprocess.check_output("lscpu", shell=True).strip()).decode()) 
Powiązane problemy