The platform module provides portable access to system information. Detect OS, architecture, and Python version without shell commands.

Quick Overview

import platform
 
# One-liner system summary
print(platform.platform())
# 'macOS-14.0-arm64-arm-64bit'
# 'Linux-5.4.0-x86_64-with-glibc2.31'
# 'Windows-10-10.0.19041-SP0'

Operating System

import platform
 
# OS name
platform.system()
# 'Darwin', 'Linux', 'Windows'
 
# OS release version
platform.release()
# '14.0', '5.4.0-generic', '10'
 
# OS version details
platform.version()
# 'Darwin Kernel Version 23.0.0...'

Machine Architecture

import platform
 
# Machine type
platform.machine()
# 'arm64', 'x86_64', 'AMD64'
 
# Processor
platform.processor()
# 'arm', 'x86_64', 'Intel64 Family 6...'
 
# Architecture
platform.architecture()
# ('64bit', '')

Python Information

import platform
 
# Python version string
platform.python_version()
# '3.12.0'
 
# Version tuple
platform.python_version_tuple()
# ('3', '12', '0')
 
# Implementation
platform.python_implementation()
# 'CPython', 'PyPy', 'Jython'
 
# Compiler
platform.python_compiler()
# 'Clang 15.0.0'
 
# Build info
platform.python_build()
# ('main', 'Oct  2 2023 12:31:55')

Node and Network

import platform
 
# Hostname
platform.node()
# 'my-laptop.local'
 
# uname (all info at once)
info = platform.uname()
print(info.system)    # 'Darwin'
print(info.node)      # 'my-laptop.local'
print(info.release)   # '14.0'
print(info.version)   # 'Darwin Kernel Version...'
print(info.machine)   # 'arm64'

Practical Examples

Cross-Platform Code

import platform
 
def get_config_dir():
    system = platform.system()
    if system == 'Windows':
        return os.environ.get('APPDATA', '')
    elif system == 'Darwin':
        return os.path.expanduser('~/Library/Application Support')
    else:  # Linux and others
        return os.environ.get('XDG_CONFIG_HOME', os.path.expanduser('~/.config'))

Feature Detection

import platform
 
def supports_feature():
    """Check if platform supports our feature."""
    system = platform.system()
    
    if system == 'Linux':
        return True
    elif system == 'Darwin':
        # Check macOS version
        version = tuple(map(int, platform.mac_ver()[0].split('.')))
        return version >= (10, 15)  # Catalina or later
    elif system == 'Windows':
        return platform.release() >= '10'
    
    return False

System Requirements Check

import platform
import sys
 
def check_requirements():
    errors = []
    
    # Check Python version
    py_version = tuple(map(int, platform.python_version_tuple()))
    if py_version < (3, 9):
        errors.append(f"Python 3.9+ required, got {platform.python_version()}")
    
    # Check architecture
    if platform.machine() not in ('x86_64', 'AMD64', 'arm64'):
        errors.append(f"Unsupported architecture: {platform.machine()}")
    
    # Check OS
    if platform.system() not in ('Linux', 'Darwin', 'Windows'):
        errors.append(f"Unsupported OS: {platform.system()}")
    
    return errors
 
errors = check_requirements()
if errors:
    print("Requirements not met:")
    for e in errors:
        print(f"  - {e}")
    sys.exit(1)

Debug Info Banner

import platform
 
def print_debug_info():
    print("=" * 50)
    print("System Information")
    print("=" * 50)
    print(f"Platform:    {platform.platform()}")
    print(f"System:      {platform.system()} {platform.release()}")
    print(f"Machine:     {platform.machine()}")
    print(f"Python:      {platform.python_version()}")
    print(f"Compiler:    {platform.python_compiler()}")
    print(f"Node:        {platform.node()}")
    print("=" * 50)

Install Script

import platform
import subprocess
 
def install_dependencies():
    system = platform.system()
    
    if system == 'Darwin':
        subprocess.run(['brew', 'install', 'libmagic'])
    elif system == 'Linux':
        # Detect distro
        if 'Ubuntu' in platform.version() or 'Debian' in platform.version():
            subprocess.run(['apt-get', 'install', '-y', 'libmagic1'])
        elif 'Fedora' in platform.version():
            subprocess.run(['dnf', 'install', '-y', 'file-libs'])
    elif system == 'Windows':
        print("Install libmagic manually on Windows")

OS-Specific Functions

import platform
 
# macOS
if platform.system() == 'Darwin':
    mac_ver = platform.mac_ver()
    print(f"macOS {mac_ver[0]}")  # '14.0'
 
# Linux
if platform.system() == 'Linux':
    # freedesktop.org os-release
    try:
        import distro  # pip install distro
        print(distro.name())  # 'Ubuntu'
    except ImportError:
        pass
 
# Windows
if platform.system() == 'Windows':
    win_ver = platform.win32_ver()
    print(f"Windows {win_ver[0]}")  # '10'

Quick Reference

import platform
 
# System
platform.system()          # 'Linux', 'Darwin', 'Windows'
platform.release()         # OS release version
platform.version()         # Detailed version
platform.platform()        # Full platform string
 
# Machine
platform.machine()         # 'x86_64', 'arm64'
platform.processor()       # Processor info
platform.architecture()    # ('64bit', '')
 
# Python
platform.python_version()  # '3.12.0'
platform.python_version_tuple()  # ('3', '12', '0')
platform.python_implementation()  # 'CPython'
 
# All at once
platform.uname()           # Named tuple with all info
 
# OS-specific
platform.mac_ver()         # macOS version tuple
platform.win32_ver()       # Windows version tuple

platform gives you clean, portable system detection. No more parsing shell command output.

React to this post: