使用Python有没有办法找到处理器信息 (我需要名字)?
我需要获取解析器正在运行的处理器的名称。我检查了sys模块,但它没有这样的函数。
如果需要,我也可以使用外部库。
platform.processor() 函数以字符串形式返回处理器名称。
>>> import platform
>>> platform.processor()
'Intel64 Family 6 Model 23 Stepping 6, GenuineIntel'
这是一段有些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 ""
如果你需要一个易于使用的软件包,可以使用cpuinfo
。
安装命令为:pip install py-cpuinfo
在命令行中使用:python -m cpuinfo
代码:
import cpuinfo
cpuinfo.get_cpu_info()['brand']
platform.processor()
更好的CPU信息。 - Stephen这里有一些代码:
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协处理器的时候...)
cpuinfo.get_cpu_info()['brand']
。打印 cpuinfo.get_cpu_info()
来检查其他感兴趣的键。 - hsandt我在这里尝试了各种解决方案。 cat /proc/cpuinf
会给出一个多核机器的大量输出,很长,而 platform.processor()
看起来只能提供很少的信息。使用Linux和Python 3,以下代码可以返回大约20行非常有用的摘要:
import subprocess
print((subprocess.check_output("lscpu", shell=True).strip()).decode())
以下是可行的代码(如果不起作用,请告诉我):
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 ""
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对于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
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
看起来@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}
# 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'}
import cpuinfo
print(cpuinfo.get_cpu_info()["brand_raw"])
Intel(R) Core(TM)2 CPU 6600 @ 2.40GHz
。这也是家族/步进和供应商字符串(“GenuineIntel”)的来源。 - Peter Cordes