Skip to content

Instantly share code, notes, and snippets.

@lighth7015
Last active February 7, 2020 17:16
Show Gist options
  • Save lighth7015/d469b3328ee5859ea8e965b315e10acc to your computer and use it in GitHub Desktop.
Save lighth7015/d469b3328ee5859ea8e965b315e10acc to your computer and use it in GitHub Desktop.
ProcessorInfo.py

Exception

Traceback (most recent call last):
  File "/usr/lib/python3.8/site-packages/circuits/core/manager.py", line 661, in _dispatcher
    value = event_handler(*eargs, **ekwargs)
  File "bin/sdk", line 18, in started
    helpCommandModule = __import__("sdk.HelpCommand").HelpCommand
  File "/home/robert_/pyx/Projects/buildsys/lib/sdk/HelpCommand.py", line 2, in <module>
    import sdk.PlatformInfo, configparser, re, pastel
  File "/home/robert_/pyx/Projects/buildsys/lib/sdk/PlatformInfo.py", line 103, in <module>
    processors = logical_processors()
  File "/home/robert_/pyx/Projects/buildsys/lib/sdk/PlatformInfo.py", line 83, in logical_processors
    props = dict((re.sub(r'_([\sa-zA-Z0-9])', lambda x: x.group(1).upper(), key.strip().replace(' ', '_')), \
  File "/home/robert_/pyx/Projects/buildsys/lib/sdk/PlatformInfo.py", line 86, in <genexpr>
    for key, value in (line.split(':') for line in processorInfo.split('\n')))
ValueError: not enough values to unpack (expected 2, got 1)
import os.path, re
from typing import List
""" Query processor info (UNIX/win32)"""
isfloat = lambda value: len(tuple(it for it in str(value.strip()).partition('.') if len(it) > 0)) == 3
tofloat = lambda value: float(str(value).strip()) if isfloat(value) else None
tofloatif = lambda value: tofloat(value) or value
class LogicalProcessor(object):
def __init__(self, args) -> None:
self.processor = args.get('processor', '')
self.vendor = args.get('vendorId', '')
self.family = args.get('cpuFamily', -1)
self.model = args.get('cpuModel', -1)
self.modelName = args.get('modelName', '')
self.stepping = args.get('stepping', -1)
self.microcode = args.get('microcode', -1)
self.cpuFreq = args.get('cpuFreq', -1.0)
self.scaleUnit = ''
self.cacheSize = args.get('cacheSize', -1)
self.processorId = args.get('processorId', -1)
self.siblings = args.get('siblings', -1)
self.core = args.get('coreId', -1)
self.apicId = args.get('apicid', -1)
self.initialApicId = args.get('initialApicid', -1)
self.fpu = args.get('fpu', False)
self.fpuException = args.get('fpuException', False)
self.cpuIdLevel = args.get('cpuidLevel', -1)
self.wp = args.get('wp', False)
self.flags: List[str] = args.get('flags', '').split(' ')
self.bogoMips = args.get('bogoMips', -1.0)
self.clflushSize = args.get('clflushSize', -1)
self.cacheAlignment = args.get('cacheAlignment', -1)
# physical-addr bits, virt-addr bits.
if addresses := args.get( 'addressSize', False ):
self.addressSizes = tuple(int(numBits.partition(' ')[0]) for numBits in addresses.split(', '))
else:
self.addressSizes = ( 0, 0 )
def __str__(self):
return ('<%s %s vendor=%s processorFamily=%s '
'model=%s modelName=%s stepping=%s microcode=%s '
'cpuFreq=%d %s cacheSize=%s processorId=%s siblings=%s '
'core=%s logicalNum=%s apicId=%s initialApicId=%s '
'fpu=%s fpuException=%s cpuIdLevel=%s '
'wp=%s flags=%s bogoMips=%s '
'clflushSize=%s cacheAlignment=%s addressSize=%s>' % (
self.__name__,
self.processor,
self.vendor,
self.processorFamily,
self.model,
self.modelName,
self.stepping,
self.microcode,
self.cpuFreq,
self.scaleUnit,
self.cacheSize,
self.processorId,
self.siblings,
self.core,
self.apicId,
self.initialApicId,
self.fpu,
self.fpuException,
self.cpuIdLevel,
self.wp,
self.flags,
self.bogoMips,
self.clflushSize,
self.cacheAlignment,
self.addressSizes))
def logical_processors() -> List[LogicalProcessor]:
cbFrequencyConv = lambda value: result if (result := ((frequency / 1000000000) * 1000)) > 0 else value
processors: List[LogicalProcessor] = []
processor: LogicalProcessor = None
cpuinfo_max_freq_path = '/sys/devices/system/cpu/cpu%d/cpufreq/cpuinfo_max_freq'
with open('/proc/cpuinfo') as f:
for processorInfo in f.read().split("\n\n"):
props = dict((re.sub(r'_([\sa-zA-Z0-9])', lambda x: x.group(1).upper(), key.strip().replace(' ', '_')), \
int(value.strip()) if value.strip().isnumeric() else \
tofloatif(value.strip())) \
for key, value in (line.split(':') for line in processorInfo.split('\n')))
print()
print(( processorInfo, props ))
if os.path.exists(( pathname := cpuinfo_max_freq_path %(int( processor.processorId )))):
with open(pathname) as fh:
processor.cpuFreq = float(cbFrequencyConv(frequency := int( fh.read( ))))
processor.scaleUnit = 'MHz' if processor.cpuFreq > 1000 else 'GHz'
processors.append(processor)
print(processors)
return processors
processors = logical_processors()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment