在Python中获取处理器信息

54

使用Python有没有办法找到处理器信息 (我需要名字)?

我需要获取解析器正在运行的处理器的名称。我检查了sys模块,但它没有这样的函数。

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

12个回答

39

platform.processor() 函数以字符串形式返回处理器名称。

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

2
有人能否说一下这个输出是否与平台无关?也就是说,在Windows/Linux/OSX上,对于相同的CPU,它是否总是给出完全相同的输出? - John La Rooy
3
如果无法确定值,将返回一个空字符串。我遇到了相同的问题。 - gorlum0
4
请注意,许多平台不提供此信息或仅返回与machine()相同的值。NetBSD会执行此操作:我遇到了这个问题。我需要知道自己是否在intel或amd上运行,因为我的脚本正在生成编译软件的配置设置,并且根据是intel还是amd,我想设置xHost或msse3选项。 - Jens Timmerman
@Spacedman: "name"确实被烧入硅片中,任何一段x86机器码都可以通过运行CPUID指令来提取它。例如:Intel(R) Core(TM)2 CPU 6600 @ 2.40GHz。这也是家族/步进和供应商字符串(“GenuineIntel”)的来源。 - Peter Cordes
3
@JohnLaRooy 我在 Ubuntu 18.04 上运行此代码只得到了一个 'x86_64' 字符串。 - ares
显示剩余6条评论

29

这是一段有些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).decode().strip()
        for line in all_info.split("\n"):
            if "model name" in line:
                return re.sub( ".*model name.*:", "", line,1)
    return ""

1
即使Python正在运行模拟,这也有助于找到正确的架构。谢谢! - legends2k
你为什么要使用subprocess和cat读取文件,而不是标准的方式?这是有特殊目的吗? - Adam Jenča

26

如果你需要一个易于使用的软件包,可以使用cpuinfo

安装命令为:pip install py-cpuinfo

在命令行中使用:python -m cpuinfo

代码:

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

4
在MacOS上,这提供了比platform.processor()更好的CPU信息。 - Stephen
这确实给出了模型名称,但是它非常缓慢,因为它计算了其他你不需要在此处使用的东西。 - Nico Schlömer
@NicoSchlömer:不知怎么的,Python 和极慢经常会一起出现(除非有一些特别优化的代码,比如 numpy);-) - serv-inc
1
不,这与Python无关。该软件包的作者决定在从文件中获取信息的同时执行一些计算。 - Nico Schlömer
值得注意的是,它使用了一个巨大的硬编码标志列表,因此请确保只依赖于你期望的特定标志;例如,如果你试图告诉用户他们的所有CPU标志,但他们有一个新的架构,其中包含自库上次更新以来发布的新功能,那么你将显示错误的信息。 - undefined

20

这里有一些代码:

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

它非常依赖于操作系统,所以有许多if分支。但它确实可以检测所有的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 系统,它似乎会使用注册表。

使用此模块获取第一个处理器名称的方法:

>>> 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协处理器的时候...)


抱歉,我需要名字,我应该提到了。 - user225312
7
链接似乎已经失效,通过在该网站上搜索“cpuinfo”会得到许多结果。请问您能否提供项目名称或代码链接? - Moh Zah
@Moh Zah,我相信这个应该是该项目的链接。 - istern
1
想看看我带有286和386 CPU的Microchannel PS/2吗?;) - Yann Vernier
在 py-cpuinfo 5.0.0 中,API 看起来是 cpuinfo.get_cpu_info()['brand']。打印 cpuinfo.get_cpu_info() 来检查其他感兴趣的键。 - hsandt

16

我在这里尝试了各种解决方案。 cat /proc/cpuinf 会给出一个多核机器的大量输出,很长,而 platform.processor() 看起来只能提供很少的信息。使用Linux和Python 3,以下代码可以返回大约20行非常有用的摘要:

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

很好,这在嵌入式系统上运行得很好,因为你并不总是有cpuinfo。干杯 - Florida Man

6

以下是可行的代码(如果不起作用,请告诉我):

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

1
在Python3中,subprocess不会返回一个str而是一个byte。你需要使用your_byte.decode('utf-8')将其转换为str。例如,在Darwin上的代码应该是model = subprocess.check_output(["/usr/sbin/sysctl", "-n", "machdep.cpu.brand_string"]).strip() ; return model.decode('utf-8') - lenooh

4

对于Windows平台,if语句中的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型号,输出应与Darwin和Linux的if块相同,例如:Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz Intel64 Family 6 Model 60 Stepping 3, GenuineIntel


4
[答案]: 这是最好的解决方案。
 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

2

看起来@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上看起来是这样的:

数据的结构确实取决于操作系统,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'}

1
简单的答案是:
import cpuinfo
print(cpuinfo.get_cpu_info()["brand_raw"])

值得一提的是,这是一个库 https://github.com/workhorsy/py-cpuinfo - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接