Получение информации о процессоре в Python - PullRequest
24 голосов
/ 30 января 2011

С помощью Python можно найти информацию о процессоре ... (мне нужно имя)

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

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

Ответы [ 9 ]

27 голосов
/ 30 января 2011

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

>>> import platform
>>> platform.processor()
'Intel64 Family 6 Model 23 Stepping 6, GenuineIntel'
12 голосов
/ 26 октября 2012

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

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 ""
11 голосов
/ 30 января 2011

Здесь есть некоторый код:

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 это выглядит как использование реестра.

Чтобы получить [первое] имя процессора с помощью этого модуля:

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

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

6 голосов
/ 09 ноября 2017

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

import subprocess
print((subprocess.check_output("lscpu", shell=True).strip()).decode())
5 голосов
/ 08 апреля 2018

Для простой в использовании упаковки вы можете использовать cpuinfo.

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

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

Код:

import cpuinfo
cpuinfo.get_cpu_info()['brand']
4 голосов
/ 23 ноября 2013

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

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 ""
2 голосов
/ 02 февраля 2016

Похоже, отсутствующий скрипт в @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'}
2 голосов
/ 26 марта 2015

В случае if для Windows, т.е. platform.processor (), просто дается описание или фамилия процессора, например Intel64 Family 6, модель 60, степпинг 3.

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

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

для получения фактической модели процессора, которая совпадает с выходом блоков if для Darwin и Linux, например Процессор Intel (R) Core (TM) i7-4790K @ 4,00 ГГц Intel64, семейство 6, модель 60, степпинг 3, GenuineIntel

0 голосов
/ 20 июня 2018

Для 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)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...