Las aplicaciones multiplataforma, instaladores, diagnósticos y herramientas de soporte necesitan identificar el sistema operativo, la arquitectura, la implementación de Python y el entorno de ejecución. platform en Python reúne funciones portables para consultar estos datos sin depender de comandos distintos en cada sistema.
El módulo es útil para informes, selección de binarios, contexto de errores y compatibilidad. Sin embargo, muchos resultados están destinados a humanos, pueden cambiar de formato y no deben utilizarse como identificadores rígidos. Esta guía diferencia datos descriptivos de decisiones estables, cubre Linux, Windows, macOS, iOS y Android y explica por qué conviene detectar capacidades.
El contenido complementa nuestras guías sobre sysconfig, types, symtable, zoneinfo y py_compile.
Vista general
import platform
print(platform.system())
print(platform.release())
print(platform.machine())
print(platform.python_implementation())
print(platform.python_version())Las funciones devuelven strings. Cuando un valor no puede determinarse, algunas retornan una string vacía. Valida antes de tomar una decisión.
platform.system()
system() devuelve un nombre general como Linux, Windows, Darwin, Android, iOS o iPadOS.
sistema = platform.system()
if sistema == "Windows":
print("entorno Windows")Crea ramas por sistema solo cuando el comportamiento realmente sea distinto. Siempre que puedas, comprueba la función, archivo, permiso o módulo requerido.
release y version
release() informa la release del sistema o kernel. version() devuelve información adicional del proveedor.
print(platform.release())
print(platform.version())No existe un formato universal. No hagas split() esperando los mismos campos.
platform.platform()
descripcion = platform.platform()La función construye una string legible con la mayor información posible. Su formato puede variar entre plataformas y versiones de Python.
Úsala en logs o soporte. No la analices para extraer datos que tienen funciones específicas.
Salida breve y aliases
print(platform.platform(terse=True))
print(platform.platform(aliased=True))terse=True reduce la salida. aliased=True puede traducir nombres históricos a nombres comunes. Cambian la presentación, no las capacidades.
uname portable
info = platform.uname()
print(info.system)
print(info.node)
print(info.release)
print(info.version)
print(info.machine)
print(info.processor)El resultado es una namedtuple. Los campos desconocidos son strings vacías. El procesador se resuelve de forma diferida.
Nombre de red
node() intenta devolver el nombre de red del equipo.
host = platform.node()Puede no ser FQDN, cambiar en containers y revelar infraestructura. Nunca lo uses como secreto, autorización o identidad permanente.
Arquitectura de la máquina
machine() puede devolver x86_64, AMD64, arm64 u otras variantes.
maquina = platform.machine().lower()El casing y los nombres cambian. Normaliza con una tabla explícita y segura.
Arquitectura del ejecutable
bits, linkage = platform.architecture()La función examina el ejecutable Python y puede depender del comando file en Unix. Los binarios universales de macOS pueden contener varias arquitecturas.
Para saber si el intérprete usa punteros de 64 bits, la documentación recomienda sys.maxsize > 2**32.
Nombre del procesador
cpu = platform.processor()Muchos entornos devuelven vacío o el mismo valor de machine(). No lo uses para detectar instrucciones de CPU.
Implementación de Python
implementacion = platform.python_implementation()Los resultados comunes incluyen CPython, PyPy, Jython e IronPython. Es mejor comprobar la capacidad necesaria que depender de la marca.
Versión de Python
texto = platform.python_version()
partes = platform.python_version_tuple()La string contiene major, minor y patch. La tupla contiene strings. Para comparar, usa sys.version_info.
Compilador y build
print(platform.python_compiler())
print(platform.python_build())Ayudan a diagnosticar extensiones nativas. Usa sysconfig para ABI, flags y rutas de compilación.
Branch y revisión
python_branch() y python_revision() pueden devolver metadatos del control de versiones. Trátalos como datos opcionales.
Distribución Linux con os-release
try:
distro = platform.freedesktop_os_release()
except OSError:
distro = {}
print(distro.get("ID"))
print(distro.get("VERSION_ID"))Para lógica usa ID, ID_LIKE, VERSION_ID y VARIANT_ID. PRETTY_NAME es para presentación.
ID_LIKE
familias = distro.get("ID_LIKE", "").split()Una familia relacionada no demuestra compatibilidad binaria ni presencia de un gestor de paquetes. Comprueba la capacidad real.
Información de Windows
release, version, service_pack, tipo = platform.win32_ver()
edicion = platform.win32_edition()
iot = platform.win32_is_iot()Los valores pueden ser vacíos o None. Las ediciones futuras deben tratarse sin fallar.
Información de macOS
release, version_info, machine = platform.mac_ver()No confundas la versión del producto macOS con el kernel Darwin.
iOS e iPadOS
ios_ver() devuelve sistema visible, release, modelo y si es simulador.
if hasattr(platform, "ios_ver"):
ios = platform.ios_ver()Prueba dispositivos físicos y simuladores.
Android
Desde Python 3.13, android_ver() puede informar versión, API level, fabricante, modelo, dispositivo y emulador.
if hasattr(platform, "android_ver"):
android = platform.android_ver()El API level del dispositivo no es igual al nivel contra el que se compiló Python.
libc en Unix
biblioteca, version = platform.libc_ver()La función examina símbolos y tiene limitaciones. Úsala para diagnóstico, no para políticas críticas.
Sistema visible frente al kernel
Android puede devolver Android aunque el kernel sea Linux. iOS es visible como iOS aunque el kernel sea Darwin.
Usa os.uname() cuando necesites el kernel y platform para la identidad visible.
Containers
Un container comparte normalmente el kernel del host, mientras /etc/os-release describe la imagen. Los datos pertenecen a capas diferentes.
No deduzcas todas las capacidades a partir de una string.
Virtualización
El módulo no ofrece detección universal de VM, container o hypervisor. Las heurísticas por fabricante generan falsos positivos.
Invalidar cachés
Python 3.14 añade invalidate_caches().
if hasattr(platform, "invalidate_caches"):
platform.invalidate_caches()Puede ser útil si cambia el hostname externamente.
Informe de soporte
def informe():
info = platform.uname()
return {
"system": info.system,
"release": info.release,
"machine": info.machine,
"python": platform.python_version(),
"implementation": platform.python_implementation(),
}Recoge solo lo necesario. El hostname y versiones detalladas pueden ser sensibles.
Decisiones por capacidad
import os
if hasattr(os, "fork"):
usar_fork()Este diseño funciona mejor en containers, implementaciones alternativas y plataformas futuras.
Selección de binarios
Usa tags de packaging y la lógica estándar de wheels, no una concatenación manual de sistema y arquitectura.
Pruebas
Mockea funciones para cubrir ramas, pero ejecuta CI real. Incluye strings vacías, casing inesperado, aliases y arquitecturas nuevas.
Errores frecuentes
- Analizar
platform.platform(). - Usar hostname como identidad.
- Suponer casing fijo en
machine(). - Comparar versiones como strings.
- Confundir sistema visible y kernel.
- Suponer que la distribución demuestra capacidades.
- Publicar demasiados datos.
- Fallar cuando un campo está vacío.
Buenas prácticas
- Usa una función específica por campo.
- Trata valores desconocidos.
- Prefiere detección de capacidad.
- Usa os-release para Linux.
- Usa tags de packaging para artefactos.
- Minimiza telemetría.
- Prueba sistemas reales.
- Invalida cachés solo cuando sea necesario.
Conclusión
platform en Python ofrece acceso portable a sistema operativo, arquitectura, implementación y versión de Python. Es excelente para diagnóstico, informes y adaptación cuidadosa.
Muchos valores son descriptivos y variables. Evita analizar strings humanas o convertir identificación en autorización. Combina platform con sysconfig, packaging y detección directa. Consulta la documentación oficial de platform y la especificación os-release.







