marca harrison
¿Qué debo mirar para ver si estoy en Windows o Unix, etc.?
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
sobresys.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.htmlAvailability: recent flavors of Unix.
– Irving Moy
22 de marzo de 2020 a las 21:49
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
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
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)
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
ont
entonces usaos.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 asys.platform
Si elos.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 ejemplolinux2
todo 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 asys.platform
Si elos.uname
lanza una excepción: github.com/python/cpython/blob/…– Heberto Mayorquín
23 de agosto a las 15:58
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
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