Получение информации о процессоре в Python

Использование Python - это любой способ узнать информацию о процессоре... (мне нужно имя)

Мне нужно имя процессора, над которым работает интерпретатор. Я проверил модуль sys, но у него нет такой функции.

Я также могу использовать внешнюю библиотеку.

Ответы

Ответ 1

Функция platform.processor() возвращает имя процессора как строку.

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

Ответ 2

Здесь есть код:

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

его очень зависимая от ОС, поэтому есть много ветвей if. Но он выполняет все возможности процессора.

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

Для linux он ищет /proc/cpuinfo и пытается использовать uname. Для Windows похоже, что он использует реестр.

Чтобы получить имя [first] процессора, используя этот модуль:

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

Если в нем будет больше одного процессора, то элементы cpuinfo.cpu.info будут иметь свои имена. Я не думаю, что когда-либо видел ПК с двумя разными процессорами (не с тех пор, как 80, когда вы могли получить копроцессор Z80 для вашего 6502 процессора BBC Micro...)

Ответ 3

Вот хакерский бит кода, который должен последовательно находить имя процессора на трех платформах, у которых есть разумный опыт.

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

Ответ 4

Рабочий код (дайте мне знать, если это не сработает для вас):

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

Ответ 5

Я попробовал различные решения здесь. cat /proc/cpuinf дает огромный объем вывода для многоядерной машины, много страниц длиной platform.processor(), кажется, дает вам очень мало. Используя Linux и Python 3, следующее возвращает полезную сводку из примерно двадцати строк:

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

Ответ 6

if-cases для Windows i.e platform.processor() просто дает описание или фамилию процессора, например. Intel64 Family 6 Model 60 Stepping 3.

Я использовал:

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

чтобы получить фактическую модель cpu, которая является тем же самым выходом, что и if-блоки для Darwin и Linux, например.     Intel (R) Core (TM) i7-4790K CPU @4.00GHz Intel64 Family 6 Model 60 Stepping 3, GenuineIntel

Ответ 7

Похоже, что отсутствует script в ответе @Spacedman:

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

Он исправлен для работы с Python 3.

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

Структура данных действительно зависит от ОС, в Windows это выглядит следующим образом:

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

В Linux это другое:

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

Ответ 8

Для простого использования можно использовать cpuinfo.

Установить как pip install py-cpuinfo

Использование из командной строки: python -m cpuinfo

Код:

import cpuinfo
cpuinfo.get_cpu_info()['brand']

Ответ 9

Для Linux и обратной совместимости с Python (не у всех есть cpuinfo), вы можете анализировать через /proc/cpuinfo напрямую. Чтобы получить скорость процессора, попробуйте:

# Take any float trailing "MHz", some whitespace, and a colon.
speeds = re.search("MHz\s*: (\d+\.?\d*)", cpuinfo_content)

Обратите внимание на необходимое использование \s для пробелов... /proc/cpuinfo самом деле имеет символы табуляции, и я много часов работал с sed пока не придумал:

sed -rn 's/cpu MHz[ \t]*: ([0-9]+\.?[0-9]*)/\1/gp' /proc/cpuinfo

Мне не хватало \t и это сводило меня с ума, потому что я либо сопоставил весь файл, либо ничего.

Попробуйте аналогичные регулярные выражения для других полей, которые вам нужны:

# Take any string after the specified field name and colon.
re.search("field name\s*: (.+)", cpuinfo_content)