¿Cómo identificar en qué sistema operativo se está ejecutando Python?

9 minutos de lectura

Avatar de usuario de Mark Harrison
marca harrison

¿Qué debo mirar para ver si estoy en Windows o Unix, etc.?

  • ver (bugs.python.org/issue12326) ¡para detalles!

    – arnkore

    18 de enero de 2012 a las 9:34

  • Aquí hay una pregunta relacionada: verifique el nombre de la distribución de Linux.

    – rubio

    08/12/2015 a las 19:00

Avatar de usuario de Louis Brandy
luis brandy

>>> import os
>>> os.name
'posix'
>>> import platform
>>> platform.system()
'Linux'
>>> platform.release()
'2.6.22-15-generic'

la salida de platform.system() es como sigue:

  • Linux: Linux
  • Mac: Darwin
  • Ventanas: Windows

Ver: platform — Acceso a los datos de identificación de la plataforma subyacente

  • ¿Por qué debería preferir platform sobre sys.platform?

    – matemáticas

    7 de noviembre de 2016 a las 14:25

  • @matth Salida ligeramente más consistente. es decir platform.system() devoluciones "Windows" en vez de "win32". sys.platform también contiene "linux2" en versiones antiguas de Python mientras contiene solo "linux" en los más nuevos. platform.system() siempre ha regresado solo "Linux".

    – eh

    9 de junio de 2017 a las 10:22


  • En mac os X, platform.system() siempre devuelve “Darwin”? o hay otro caso posible?

    – baptiste chéné

    12 de enero de 2018 a las 13:35

  • @baptistechéné, sé que esto tiene más de un año desde que lo preguntaste, pero como un comentario no hará daño, lo publicaré de todos modos 🙂 Entonces, la razón detrás de esto es porque muestra el nombre del kernel. De la misma manera, las distribuciones de Linux (el kernel) tienen muchos nombres (Ubuntu, Arch, Fedora, entre otros), pero se presentará como el nombre del kernel, Linux. Darwin (un Kernel basado en BSD), tiene su sistema circundante, el macOS. Estoy bastante seguro de que Apple lanzó Darwin como un código fuente abierto, pero no hay otra distribución que se ejecute sobre Darwin que yo sepa.

    – Joao Paulo Rabelo

    30 de enero de 2019 a las 12:05

  • @TooroSan os.uname() solo existe para sistemas Unix. Los documentos de Python 3: docs.python.org/3/library/os.html Availability: recent flavors of Unix.

    – Irving Moy

    22 de marzo de 2020 a las 21:49


Avatar de usuario de Joey deVilla
joey de villa

Dang — Louis Brandy se me adelantó, ¡pero eso no significa que no pueda proporcionarle los resultados del sistema para Vista!

>>> import os
>>> os.name
'nt'
>>> import platform
>>> platform.system()
'Windows'
>>> platform.release()
'Vista'

… y no puedo creer que nadie haya publicado uno para Windows 10 todavía:

>>> import os
>>> os.name
'nt'
>>> import platform
>>> platform.system()
'Windows'
>>> platform.release()
'10'

  • ventanas 7: platform.release() '7'

    – Hugo

    20 de abril de 2015 a las 12:27

  • Entonces, sí, acabo de correr platform.release() en mi ventanas 10y definitivamente me acaba de dar '8'. Tal vez instalé python antes de actualizar, pero ¿en serio?

    – Codesmith

    8 jun 2017 a las 13:35

  • Habría pensado que es más probable que haya actualizado desde Windows 8 (en lugar de que sea una instalación limpia) y lo que sea que Python busque en el registro o lo que sea que haya quedado atrás.

    – OJFord

    30 de enero de 2018 a las 20:53

  • La búsqueda de lanzamiento de python en Windows parece usar la función GetVersionEx de Win32 api en su núcleo. Las notas en la parte superior de este artículo de Microsoft sobre esa función podrían ser relevantes: msdn.microsoft.com/en-us/library/windows/desktop/…

    – theferrit32

    22 de marzo de 2018 a las 20:13


Avatar de usuario de Mark Harrison
marca harrison

Para que conste aquí están los resultados en Mac:

>>> import os
>>> os.name
'posix'
>>> import platform
>>> platform.system()
'Darwin'
>>> platform.release()
'8.11.1'

  • En macOS Catalina 10.15.2, platform.release() devoluciones '19.2.0'

    – Boris Verjovskiy

    27 de diciembre de 2019 a las 4:55


  • 19.2.0 es la versión de lanzamiento de Darwin que viene con Catalina 10.15.2: en.wikipedia.org/wiki/MacOS_Catalina#Release_history

    – philshem

    21 de agosto de 2020 a las 13:28

avatar de usuario de user3928804
usuario3928804

Ejemplo de código para diferenciar los sistemas operativos usando Python:

import sys

if sys.platform.startswith("linux"):  # could be "linux", "linux2", "linux3", ...
    # linux
elif sys.platform == "darwin":
    # MAC OS X
elif sys.platform == "win32":
    # Windows (either 32-bit or 64-bit)

Avatar de usuario de Shital Shah
sha de mierda

Cuento

Usar platform.system(). Vuelve Windows, Linux o Darwin (para OSX).

Larga historia

Hay 3 formas de obtener el sistema operativo en Python, cada una con sus propias ventajas y desventajas:

Método 1

>>> import sys
>>> sys.platform
'win32'  # could be 'linux', 'linux2, 'darwin', 'freebsd8' etc

Cómo funciona esto (fuente): Internamente llama a las API del sistema operativo para obtener el nombre del sistema operativo definido por el sistema operativo. Consulte aquí para conocer varios valores específicos del sistema operativo.

Pro: Sin magia, bajo nivel.

Con: depende de la versión del sistema operativo, por lo que es mejor no usarlo directamente.

Método 2

>>> import os
>>> os.name
'nt'  # for Linux and Mac it prints 'posix'

Cómo funciona esto (fuente): Internamente, comprueba si Python tiene módulos específicos del sistema operativo llamados posix o nt.

Pro: fácil de comprobar si posix OS

Con: no hay diferenciación entre Linux u OSX.

Método 3

>>> import platform
>>> platform.system()
'Windows' # for Linux it prints 'Linux', Mac it prints `'Darwin'

Cómo funciona esto (fuente): Internamente, eventualmente llamará a las API internas del sistema operativo, obtendrá un nombre específico de la versión del sistema operativo como ‘win32’ o ‘win16’ o ‘linux1’ y luego se normalizará a nombres más genéricos como ‘Windows’ o ‘Linux’ o ‘Darwin’ aplicando varias heurísticas.

Pro: la mejor forma portátil para Windows, OSX y Linux.

Con: La gente de Python debe mantener actualizada la heurística de normalización.

Resumen

  • Si desea verificar si el sistema operativo es Windows, Linux u OSX, la forma más confiable es platform.system().
  • Si desea realizar llamadas específicas del sistema operativo pero a través de módulos integrados de Python posix o nt entonces usa os.name.
  • Si desea obtener el nombre del sistema operativo en bruto tal como lo proporciona el propio sistema operativo, utilice sys.platform.

  • Esto en cuanto a “Debería haber una (y preferiblemente solo una) forma de hacer las cosas”. Sin embargo, creo que esta es la respuesta correcta. Tendría que comparar con los nombres de los sistemas operativos titulados, pero no es un problema y será más portátil.

    – vincent-lg

    13 abr 2020 a las 10:00

  • Tenga en cuenta que en Python 3.10, platform.system por defecto a sys.platform Si el os.uname lanza una excepción: github.com/python/cpython/blob/…

    – Heberto Mayorquín

    23 de agosto a las 15:58


Comencé una lista un poco más sistemática de los valores que puede esperar al usar los distintos módulos (siéntase libre de editar y agregar su sistema):

Linux (64 bits) + WSL

                            x86_64            aarch64
                            ------            -------
os.name                     posix             posix
sys.platform                linux             linux
platform.system()           Linux             Linux
sysconfig.get_platform()    linux-x86_64      linux-aarch64
platform.machine()          x86_64            aarch64
platform.architecture()     ('64bit', '')     ('64bit', 'ELF')
  • probé con archlinux y mint, obtuve los mismos resultados
  • en python2 sys.platform tiene el sufijo de la versión del núcleo, por ejemplo linux2todo lo demás permanece idéntico
  • mismo resultado en el subsistema de Windows para Linux (probado con ubuntu 18.04 LTS), excepto platform.architecture() = ('64bit', 'ELF')

VENTANAS (64 bits)

(con columna de 32 bits ejecutándose en el subsistema de 32 bits)

official python installer   64bit                     32bit
-------------------------   -----                     -----
os.name                     nt                        nt
sys.platform                win32                     win32
platform.system()           Windows                   Windows
sysconfig.get_platform()    win-amd64                 win32
platform.machine()          AMD64                     AMD64
platform.architecture()     ('64bit', 'WindowsPE')    ('64bit', 'WindowsPE')

msys2                       64bit                     32bit
-----                       -----                     -----
os.name                     posix                     posix
sys.platform                msys                      msys
platform.system()           MSYS_NT-10.0              MSYS_NT-10.0-WOW
sysconfig.get_platform()    msys-2.11.2-x86_64        msys-2.11.2-i686
platform.machine()          x86_64                    i686
platform.architecture()     ('64bit', 'WindowsPE')    ('32bit', 'WindowsPE')

msys2                       mingw-w64-x86_64-python3  mingw-w64-i686-python3
-----                       ------------------------  ----------------------
os.name                     nt                        nt
sys.platform                win32                     win32
platform.system()           Windows                   Windows
sysconfig.get_platform()    mingw                     mingw
platform.machine()          AMD64                     AMD64
platform.architecture()     ('64bit', 'WindowsPE')    ('32bit', 'WindowsPE')

cygwin                      64bit                     32bit
------                      -----                     -----
os.name                     posix                     posix
sys.platform                cygwin                    cygwin
platform.system()           CYGWIN_NT-10.0            CYGWIN_NT-10.0-WOW
sysconfig.get_platform()    cygwin-3.0.1-x86_64       cygwin-3.0.1-i686
platform.machine()          x86_64                    i686
platform.architecture()     ('64bit', 'WindowsPE')    ('32bit', 'WindowsPE')

Algunas observaciones:

  • también hay distutils.util.get_platform() que es idéntico a `sysconfig.get_platform
  • anaconda en Windows es igual que el instalador oficial de Windows de Python
  • No tengo una Mac ni un verdadero sistema de 32 bits y no estaba motivado para hacerlo en línea.

Para comparar con su sistema, simplemente ejecute este script (y agregue los resultados aquí si faltan 🙂

from __future__ import print_function
import os
import sys
import platform
import sysconfig

print("os.name                      ",  os.name)
print("sys.platform                 ",  sys.platform)
print("platform.system()            ",  platform.system())
print("sysconfig.get_platform()     ",  sysconfig.get_platform())
print("platform.machine()           ",  platform.machine())
print("platform.architecture()      ",  platform.architecture())

  • Esto en cuanto a “Debería haber una (y preferiblemente solo una) forma de hacer las cosas”. Sin embargo, creo que esta es la respuesta correcta. Tendría que comparar con los nombres de los sistemas operativos titulados, pero no es un problema y será más portátil.

    – vincent-lg

    13 abr 2020 a las 10:00

  • Tenga en cuenta que en Python 3.10, platform.system por defecto a sys.platform Si el os.uname lanza una excepción: github.com/python/cpython/blob/…

    – Heberto Mayorquín

    23 de agosto a las 15:58


Avatar de usuario de Georgy
georgia

También puedes usar sys.platform si ya has importado sys y no quieres importar otro módulo

>>> import sys
>>> sys.platform
'linux2'

  • ¿Alguno de los enfoques tiene alguna ventaja, además de tener o no importar otro módulo?

    – matemáticas

    7 de noviembre de 2016 a las 14:41

  • El alcance es la principal ventaja. Desea la menor cantidad posible de nombres de variables globales. Cuando ya tiene “sys” como nombre global, no debe agregar otro. Pero si aún no usa “sys”, usar “_platform” podría ser más descriptivo y menos probable que colisione con otro significado.

    – sanderd17

    21 de diciembre de 2016 a las 9:01

¿Ha sido útil esta solución?