Загрузка данных
import os
import platform
import subprocess
import sys
import psutil
def get_size(bytes_value):
"""Конвертирует байты в гигабайты с округлением"""
gb_value = bytes_value / (1024 ** 3)
return f"{gb_value:.2f} GB"
def get_gpu_model():
"""Получает точное название видеокарты через lspci"""
try:
output = subprocess.check_output("lspci | grep -Ei 'vga|3d|display'", shell=True).decode('utf-8')
lines = output.strip().split('\n')
gpus = []
for line in lines:
if ":" in line:
parts = line.split(":")
gpu_name = parts[1].strip() if len(parts) > 2 else parts[0].strip()
gpu_name = gpu_name.replace("Controller", "").replace("Graphics", "").strip()
gpus.append(gpu_name)
return ", ".join(gpus) if gpus else "Unknown GPU"
except Exception:
return "Unknown GPU"
def get_motherboard():
"""Получает модель материнской платы"""
try:
with open("/sys/class/dmi/id/board_name", "r") as f:
board = f.read().strip()
with open("/sys/class/dmi/id/board_vendor", "r") as f:
vendor = f.read().strip()
return f"{vendor} {board}"
except Exception:
return "Unknown Motherboard"
# Маленький и аккуратный Tux из Neofetch
NEOFETCH_SMALL_TUX = [
" .--. ",
" |o_o | ",
" |:_/ | ",
" // \\\\ ",
" (| | ) ",
"/'\\_ _/`\\ ",
"\\___)=(___/ "
]
def main():
# Сбор данных о системе
username = os.getlogin()
hostname = platform.node()
cpu_model = "Unknown"
try:
if os.path.exists("/proc/cpuinfo"):
with open("/proc/cpuinfo", "r") as f:
for line in f:
if "model name" in line:
cpu_model = line.split(":")[1].strip()
break
except Exception:
pass
if not cpu_model or cpu_model == "Unknown":
cpu_model = platform.processor()
# Детали процессора (Частота)
try:
cpu_freq = f"{psutil.cpu_freq().max:.0f} MHz" if psutil.cpu_freq() else "Unknown"
except Exception:
cpu_freq = "Unknown"
# Сбор данных о памяти
memory = psutil.virtual_memory()
ram_total = get_size(memory.total)
ram_used = get_size(memory.used)
ram_free = get_size(memory.available)
# Сбор данных о диске
disk = psutil.disk_usage('/')
disk_total = get_size(disk.total)
disk_used = get_size(disk.used)
disk_free = get_size(disk.free)
# Формируем список характеристик железа (без строки батареи)
info_lines = [
f"{username}@{hostname}",
"--------------------------------------------------",
f"OS: {platform.system()} {platform.release()} ({platform.machine()})",
f"MOTHERBOARD:{get_motherboard()}",
f"CPU: {cpu_model} @ {cpu_freq}",
f"CORES: {psutil.cpu_count(logical=False)} physical / {psutil.cpu_count(logical=True)} logical",
f"GPU: {get_gpu_model()}",
f"RAM USED: {ram_used} / {ram_total} (Free: {ram_free})",
f"DISK USED: {disk_used} / {disk_total} (Free: {disk_free})"
]
# Вывод маленького пингвина и подробной инфы бок о бок
max_lines = max(len(NEOFETCH_SMALL_TUX), len(info_lines))
for i in range(max_lines):
logo_part = NEOFETCH_SMALL_TUX[i] if i < len(NEOFETCH_SMALL_TUX) else " " * 15
info_part = info_lines[i] if i < len(info_lines) else ""
print(f"{logo_part} {info_part}")
if __name__ == "__main__":
main()