Files
2026-02-12 14:18:53 +03:00

122 lines
2.9 KiB
Python

__all__ = ["SystemInfo", "get_system_info"]
import platform
import sys
from dataclasses import dataclass
import cpuinfo
import psutil
@dataclass(frozen=True, slots=True)
class OSInfo:
name: str
kernel_version: str
@dataclass(frozen=True, slots=True)
class CPUInfo:
name: str
architecture: str
physical_cores: int
logical_cores: int
max_frequency: float
@dataclass(frozen=True, slots=True)
class MemoryInfo:
total_ram: float # in GB
used_ram: float # in GB
available_ram: float # in GB
@dataclass(frozen=True, slots=True)
class PythonInfo:
version: str
implementation: str
compiler: str
def get_os_info() -> OSInfo:
system = platform.system()
if system == "Windows":
ver = sys.getwindowsversion()
kernel_version = f"{ver.major}.{ver.minor}.{ver.build}"
if ver.build >= 22000:
product_name = "Windows 11"
else:
product_name = "Windows 10"
return OSInfo(
name=product_name,
kernel_version=kernel_version,
)
elif system == "Darwin":
return OSInfo(kernel_version=platform.release(), name=f"macOS {platform.mac_ver()[0]}")
else:
return OSInfo(kernel_version=platform.release(), name=platform.system())
def get_cpu_info() -> CPUInfo:
cpu_info = cpuinfo.get_cpu_info()
cpu_name = cpu_info["brand_raw"]
cpu_architecture = cpu_info["arch"]
cpu_physical_cores = psutil.cpu_count(logical=False) or 0
cpu_logical_cores = psutil.cpu_count(logical=True) or 0
cpu_freq = psutil.cpu_freq()
cpu_max_frequency = cpu_freq.max
return CPUInfo(
name=cpu_name,
architecture=cpu_architecture,
physical_cores=cpu_physical_cores,
logical_cores=cpu_logical_cores,
max_frequency=cpu_max_frequency,
)
def get_memory_info() -> MemoryInfo:
mem = psutil.virtual_memory()
total_ram = round(mem.total / (1024**3), 2)
used_ram = round(mem.used / (1024**3), 2)
available_ram = round(mem.available / (1024**3), 2)
return MemoryInfo(
total_ram=total_ram,
used_ram=used_ram,
available_ram=available_ram,
)
def get_python_info() -> PythonInfo:
python_version = platform.python_version()
python_implementation = platform.python_implementation()
python_compiler = platform.python_compiler()
return PythonInfo(
version=python_version, implementation=python_implementation, compiler=python_compiler
)
@dataclass(frozen=True, slots=True)
class SystemInfo:
os_info: OSInfo
cpu_info: CPUInfo
memory_info: MemoryInfo
python_info: PythonInfo
def get_system_info() -> SystemInfo:
os_info = get_os_info()
cpu_info = get_cpu_info()
memory_info = get_memory_info()
python_info = get_python_info()
return SystemInfo(
os_info=os_info,
cpu_info=cpu_info,
memory_info=memory_info,
python_info=python_info,
)