# System Information Tool

This utility gathers and displays detailed information about the system hardware and operating system. It demonstrates how to use the standard `platform` module for OS details and the powerful third-party `psutil` library for hardware utilization stats.

**Modules Used:**
*   [[programming/python/modules/platform-module|platform]]: To retrieve operating system and processor information.
*   `psutil`: To retrieve CPU, memory, and disk usage statistics.

## Installation

You will need to install `psutil`:

```bash
pip install psutil
```

## The Code

Save this as `sysinfo.py`.

```python
import platform
import psutil
from datetime import datetime

def get_size(bytes, suffix="B"):
    """
    Scale bytes to its proper format
    e.g:
        1253656 => '1.20MB'
        1253656678 => '1.17GB'
    """
    factor = 1024
    for unit in ["", "K", "M", "G", "T", "P"]:
        if bytes < factor:
            return f"{bytes:.2f}{unit}{suffix}"
        bytes /= factor

def print_system_info():
    print("="*40, "System Information", "="*40)
    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}")

def print_cpu_info():
    print("="*40, "CPU Info", "="*40)
    # 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()
    if cpufreq:
        print(f"Max Frequency: {cpufreq.max:.2f}Mhz")
        print(f"Current Frequency: {cpufreq.current:.2f}Mhz")
    
    # CPU usage
    print(f"Total CPU Usage: {psutil.cpu_percent(interval=1)}%")

def print_memory_info():
    print("="*40, "Memory Information", "="*40)
    # Virtual memory
    svmem = psutil.virtual_memory()
    print(f"Total: {get_size(svmem.total)}")
    print(f"Available: {get_size(svmem.available)}")
    print(f"Used: {get_size(svmem.used)}")
    print(f"Percentage: {svmem.percent}%")

def print_disk_info():
    print("="*40, "Disk Information", "="*40)
    
    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:
            # Catch errors for disks that aren't ready
            continue
            
        print(f"  Total Size: {get_size(partition_usage.total)}")
        print(f"  Used: {get_size(partition_usage.used)}")
        print(f"  Free: {get_size(partition_usage.free)}")
        print(f"  Percentage: {partition_usage.percent}%")

if __name__ == "__main__":
    print_system_info()
    print_cpu_info()
    print_memory_info()
    print_disk_info()
```

## Usage

```bash
python sysinfo.py
```

[[programming/python/python]]