web-dev-qa-db-ja.com

Pythonでプロセッサ情報を取得する

Pythonを使用して、プロセッサ情報を見つける方法はありますか...(名前が必要です)

インタープリターが実行されているプロセッサーの名前が必要です。私はsysモジュールをチェックしましたが、そのような機能はありません。

必要に応じて、外部ライブラリも使用できます。

30
user225312

platform.processor() 関数は、プロセッサ名を文字列として返します。

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

これは、私が妥当な経験を持っている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 ""
12
dbn

ここにいくつかのコードがあります:

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

oSに非常に依存しているため、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の要素に名前が付けられます。私は2つの異なるプロセッサを搭載したPCを見たことがないと思います(80年代から、6502 CPU BBC Micro用のZ80コプロセッサを手に入れることができたので...)

11
Spacedman

ここで様々な解決策を試しました。 _cat /proc/cpuinf_は、マルチコアマシンに大量の出力を提供します。ページ数が多く、platform.processor()はほとんど提供しないようです。 LinuxとPython 3を使用すると、以下は約20行の非常に有用な要約を返します。

_import subprocess
print((subprocess.check_output("lscpu", Shell=True).strip()).decode())
_
6
cardamom

使いやすいパッケージには、 cpuinfo を使用できます。

pip install py-cpuinfoとしてインストール

コマンドラインから使用:python -m cpuinfo

コード:

import cpuinfo
cpuinfo.get_cpu_info()['brand']
5
serv-inc

動作するコード(これが機能しない場合はお知らせください):

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 ""
4
Phil L.

@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

データの構造は確かにOSに依存しており、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

Windowsのif-cases、つまり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])

darwinとLinuxのifブロックと同じ出力である実際のCPUモデルを取得するには、例えばIntel(R)Core(TM)i7-4790K CPU @ 4.00GHz Intel64 Family 6 Model 60 Stepping 3、GenuineIntel

2
oche

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)  
0
Joshua Detwiler