在Python中获取处理器信息

时间:2011-01-30 10:44:20

标签: python processor

使用Python有任何方法可以找到处理器信息......(我需要名称)

我需要运行解释器的处理器的名称。我检查了sys模块,但它没有这样的功能。

如果需要,我也可以使用外部库。

10 个答案:

答案 0 :(得分:27)

platform.processor()函数将处理器名称作为字符串返回。

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

答案 1 :(得分:11)

这里有一些代码:

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

它非常依赖操作系统,所以有很多if-branches。但它确实能够解决所有CPU功能。

$ 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年代以来,你可以为你的6502 CPU BBC Micro配备Z80协处理器......)

答案 2 :(得分:10)

这是一个hackish的代码,应该始终在我有任何合理经验的三个平台上找到处理器的名称。

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

答案 3 :(得分:6)

我在这里尝试了各种解决方案。 cat /proc/cpuinf为多核计算机提供了大量输出,多页长,platform.processor()似乎给你很少。使用Linux和Python 3,以下内容返回了大约20行的非常有用的摘要:

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

答案 4 :(得分:5)

对于易于使用的包,您可以使用cpuinfo

安装为$(window).on('beforeunload', function(){ socket.emit('LEAVE_ROOM', reason); });

从命令行使用:pip install py-cpuinfo

代码:

python -m cpuinfo

答案 5 :(得分: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 ""

答案 6 :(得分:2)

Windows的if-cases,即platform.processor()只提供处理器的描述或系列名称,例如: Intel64系列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])

获取实际的cpu模型,该模型与Darwin和Linux的if-blocks具有相同的输出,例如:       Intel(R)Core(TM)i7-4790K CPU @ 4.00GHz Intel64 Family 6 Model 60 Stepping 3,GenuineIntel

答案 7 :(得分:1)

看起来@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 :(得分:1)

[答案]:效果最好

 import cpuinfo
 cpuinfo.get_cpu_info()['brand_raw'] # get only the brand name

 import cpuinfo
 cpuinfo.get_cpu_info()

获取有关CPU的所有信息

{'python_version': '3.7.6.final.0 (64 bit)',
 'cpuinfo_version': [7, 0, 0],
 'cpuinfo_version_string': '7.0.0',
 'arch': 'X86_64',
 'bits': 64,
 'count': 2,
 'arch_string_raw': 'x86_64',
 'vendor_id_raw': 'GenuineIntel',
 'brand_raw': 'Intel(R) Xeon(R) CPU @ 2.00GHz',
 'hz_advertised_friendly': '2.0000 GHz',
 'hz_actual_friendly': '2.0002 GHz',
 'hz_advertised': [2000000000, 0],
 'hz_actual': [2000176000, 0],
 'stepping': 3,
 'model': 85,
 'family': 6,
 'flags': ['3dnowprefetch',
  'abm',
  'adx', ...more

答案 9 :(得分:0)

对于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)