دریافت اطلاعات سخت افزار با پایتون

امیرحسین بیگدلو 5 ماه قبل

استفاده از کتابخانه های خارجی پایتون به برنامه نویس کمک میکند تا به جای ساخت دوباره چرخ، از ابزارهایی که دیگران ساخته است بهره ببرد. در این آموزش شما با psutil که یک کتابخانه بین پلتفرمی برای نظارت بر پراسس و سیستم در پایتون است و همچنین ماژول platform داخلی برای استخراج اطلاعات سیستم و سخت افزار در پایتون آشنا خواهید شد.

 

ابزارهای بسیار محبوبی برای استخراج اطلاعات سیستم و سخت افزار در لینوکس وجود دارد، مانند lshw، uname و hostnamectl. با این حال، ما از کتابخانه psutil در پایتون استفاده خواهیم کرد تا بتواند روی همه سیستم عامل ها اجرا شود و نتایج تقریباً یکسانی نمایش دهد.

 

قبل از شروع به کار باید پکیج psutil را با دستور زیر نصب کنید:

pip install psutil

 

ویدیو پیشنهادی: آموزش ماژول platform در پایتون

 

دریافت اطلاعات سیستم عامل

برای دریافت اطلاعات سیستم عامل میتوانید از ماژول platform پایتون استفاده کنید:

 

import platform

uname = platform.uname()
print(f"System: {uname.system}")
print(f"Node Name: {uname.node}")
print(f"Release: {uname.release}")
print(f"Version: {uname.version}")
print(f"Machine: {uname.machine}")
print(f"Processor: {uname.processor}")

 

در کد بالا از تابع uname برای دریافت اطلاعات سیستم استفاده کردیم. این تابع یک تاپل را برمی گرداند که اطلاعات مربوط به سیستم را ذخیره می کند. اساساً این تابع می تواند برای جایگزینی توابع جداگانه برای بازیابی اطلاعات مربوط به سیستم، گره، انتشار، نسخه، ماشین و پردازنده استفاده شود.

 

اگر کد بالا را اجرا کنید، نتیجه مشابه زیر خواهد بود:

System: Linux
Node Name: big
Release: 5.15.25-1-MANJARO
Version: #1 SMP PREEMPT Wed Feb 23 14:44:03 UTC 2022
Machine: x86_64
Processor: 

 

دقت کنید که پایتون نتوانست نوع پردازنده را تشخیص دهد.

 

همچنین برای دریافت زمان بوت شدن سیستم میتوانید از ماژول psutil استفاده کنید:

import psutil
from datetime import datetime

boot_time_timestamp = psutil.boot_time()
bt = datetime.fromtimestamp(boot_time_timestamp)
print(f"Boot Time: {bt.year}/{bt.month}/{bt.day} {bt.hour}:{bt.minute}:{bt.second}")

 

در قطعه کد بالا از تابع boot_time برای دسترسی به زمان بوت سیستم عامل استفاده کردیم.

 

ویدیو پیشنهادی: آموزش آرایه در پایتون

 

دریافت اطلاعات پردازنده با پایتون

میتوانید از ماژول psutil برای دریافت اطلاعات مربوط به پردازنده مانند تعداد هسته ها، میزان فرکانس و ... استفاده کنید:

 

import psutil

# number of cores
print("Physical cores:", psutil.cpu_count(logical=False))
print("Total cores:", psutil.cpu_count(logical=True))
# CPU frequencies
cpufreq = psutil.cpu_freq()
print(f"Max Frequency: {cpufreq.max:.2f}Mhz")
print(f"Min Frequency: {cpufreq.min:.2f}Mhz")
print(f"Current Frequency: {cpufreq.current:.2f}Mhz")
# CPU usage
print("CPU Usage Per Core:")
for i, percentage in enumerate(psutil.cpu_percent(percpu=True, interval=1)):
    print(f"Core {i}: {percentage}%")
print(f"Total CPU Usage: {psutil.cpu_percent()}%")

 

تابع cpu_count ماژول psutil تعداد هسته‌ها را برمی‌گرداند، در حالی که تابع ()cpu_freq فرکانس CPU را شامل جریان، حداقل و حداکثر فرکانس بیان شده بر حسب مگاهرتز برمی‌گرداند، می‌توانید percpu=True را برای دریافت هر فرکانس CPU تنظیم کنید.

 

متد cpu_percent نشان‌دهنده استفاده فعلی از CPU را به صورت درصد برمی‌گرداند، با تنظیم فاصله روی 1 (ثانیه) زمان‌های سپری شده CPU سیستم قبل و بعد از یک ثانیه مقایسه می‌شود، ما percpu را روی True تنظیم می‌کنیم تا میزان استفاده از CPU از هر هسته را بدست آوریم.

 

مقاله پیشنهادی: آموزش کار با ماتریس(matrix) در پایتون

 

دریافت اطلاعات حافظه مموری با پایتون

برای دریافت اطلاعات مربوط به حافظه مموری و حافظه swap میتوانید از ماژول psutil پایتون استفاده کنید:

 

import psutil

# get the memory details
svmem = psutil.virtual_memory()
print(f"Total: {svmem.total}")
print(f"Available: {svmem.available}")
print(f"Used: {svmem.used}")
print(f"Percentage: {svmem.percent}%")

# get the swap memory details (if exists)
swap = psutil.swap_memory()
print(f"Total: {swap.total}")
print(f"Free: {swap.free}")
print(f"Used: {swap.used}")
print(f"Percentage: {swap.percent}%")

 

متد virtual_memory آمار مربوط به استفاده از حافظه سیستم را به صورت namedtuple، شامل فیلدهایی مانند total (کل حافظه فیزیکی موجود)، available (حافظه موجود، یعنی استفاده نشده)، used و percent برمی گرداند.

 

تابع swap_memory نیز اطلاعات مربوط به حافظه swap را به همین شکل برمیگرداند.

 

دوره پیشنهادی: دوره آموزش رایگان پایتون

 

دریافت اطلاعات دیسک با پایتون

از ماژول psutil میتوانید برای دریافت اطلاعات مربوط به دیسک نیز استفاده کنید:

 

import psutil

# Disk Information
print("="*40, "Disk Information", "="*40)
print("Partitions and Usage:")
# get all disk partitions
partitions = psutil.disk_partitions()
for partition in partitions:
    print(f"=== Device: {partition.device} ===")
    print(f"  Mountpoint: {partition.mountpoint}")
    print(f"  File system type: {partition.fstype}")
    try:
        partition_usage = psutil.disk_usage(partition.mountpoint)
    except PermissionError:
        # this can be catched due to the disk that
        # isn't ready
        continue
    print(f"  Total Size: {partition_usage.total}")
    print(f"  Used: {partition_usage.used}")
    print(f"  Free: {partition_usage.free}")
    print(f"  Percentage: {partition_usage.percent}%")
# get IO statistics since boot
disk_io = psutil.disk_io_counters()
print(f"Total read: {disk_io.read_bytes}")
print(f"Total write: {disk_io.write_bytes}")

 

همانطور که انتظار می‌رفت، تابع disk_usage آمار استفاده از دیسک را به‌صورت namedtuple، شامل فضای کل، استفاده‌شده و آزاد که در بایت بیان می‌شود، برمی‌گرداند.

 

مقاله پیشنهادی: دیتابیس در پایتون

 

دریافت اطلاعات شبکه با پایتون

برای دریافت اطلاعات مربوط به شبکه میتوانید از ماژول psutil پایتون استفاده کنید:

 

import psutil

# Network information
print("="*40, "Network Information", "="*40)
# get all network interfaces (virtual and physical)
if_addrs = psutil.net_if_addrs()
for interface_name, interface_addresses in if_addrs.items():
    for address in interface_addresses:
        print(f"=== Interface: {interface_name} ===")
        if str(address.family) == 'AddressFamily.AF_INET':
            print(f"  IP Address: {address.address}")
            print(f"  Netmask: {address.netmask}")
            print(f"  Broadcast IP: {address.broadcast}")
        elif str(address.family) == 'AddressFamily.AF_PACKET':
            print(f"  MAC Address: {address.address}")
            print(f"  Netmask: {address.netmask}")
            print(f"  Broadcast MAC: {address.broadcast}")
# get IO statistics since boot
net_io = psutil.net_io_counters()
print(f"Total Bytes Sent: {net_io.bytes_sent}")
print(f"Total Bytes Received: {net_io.bytes_recv}")

 

تابع net_if_addrs() آدرس های مرتبط با هر کارت رابط شبکه نصب شده روی سیستم را برمی گرداند.

 

اگر از لپ تاپ استفاده می کنید، می توانید از psutil.sensors_battery برای دریافت اطلاعات باتری استفاده کنید.

 

همچنین، اگر کاربر لینوکس هستید، می توانید از psutil.sensors_fan برای دریافت RPM فن و همچنین psutil.sensors_temperatures برای دریافت دمای دستگاه های مختلف استفاده کنید.

 

مقاله پیشنهادی: اجرای مجدد تسک های ناموفق در سلری

 

دریافت اطلاعات کارت گرافیک با پایتون

ماژول psutil پایتون نمیتوانید اطلاعات مربوط به کارت گرافیک را به شما نشان دهد. برای گرفتن اطلاعات مربوط به کارت گرافیک در پایتون باید از ماژول gputil استفاده کنید. با دستور زیر این پکیج را نصب کنید:

pip install gputil

 

GPUtil یک ماژول پایتون برای دریافت وضعیت GPU فقط برای پردازنده‌های گرافیکی NVIDIA است، همه پردازنده‌های گرافیکی روی رایانه را مکان‌یابی می‌کند، در دسترس بودن آن‌ها را تعیین می‌کند و فهرست مرتب‌شده‌ای از GPUهای موجود را برمی‌گرداند.

 

همچنین، ما نیاز به نصب ماژول tabulate داریم که به ما امکان می دهد اطلاعات GPU را به صورت جدولی چاپ کنیم:

pip install tabulate

 

خطوط کد زیر همه GPUهای دستگاه شما را همراه با جزئیات آنها چاپ می کند:

# GPU information
import GPUtil
from tabulate import tabulate
print("="*40, "GPU Details", "="*40)
gpus = GPUtil.getGPUs()
list_gpus = []
for gpu in gpus:
    # get the GPU id
    gpu_id = gpu.id
    # name of GPU
    gpu_name = gpu.name
    # get % percentage of GPU usage of that GPU
    gpu_load = f"{gpu.load*100}%"
    # get free memory in MB format
    gpu_free_memory = f"{gpu.memoryFree}MB"
    # get used memory
    gpu_used_memory = f"{gpu.memoryUsed}MB"
    # get total memory
    gpu_total_memory = f"{gpu.memoryTotal}MB"
    # get GPU temperature in Celsius
    gpu_temperature = f"{gpu.temperature} °C"
    gpu_uuid = gpu.uuid
    list_gpus.append((
        gpu_id, gpu_name, gpu_load, gpu_free_memory, gpu_used_memory,
        gpu_total_memory, gpu_temperature, gpu_uuid
    ))

print(tabulate(list_gpus, headers=("id", "name", "load", "free memory", "used memory", "total memory","temperature", "uuid")))

 

 

مطالب مشابه



مونگارد