先说结论
os.name
常用来判断是 windows 还是非 windows:
import os
IS_WINDOWS = bool(os.name == 'nt')
os.uname
不常用.
sys.platform
常用来判断 linux/mac/win 三大系统:
import sys
match sys.platform:
case 'darwin':
...
case 'linux':
...
case 'win32':
...
或者, 我们也常用 platform.system
来判断 linux/mac/win 三大系统:
import platform
match platform.system(): # 注意末尾的括号
case 'Darwin': # 注意首字母大写
...
case 'Linux':
...
case 'Windows':
...
platform
模块很适合需要对多系统提供支持的开发者, 比如要处理多平台, 多架构下的打包和适配工作.
sys.platform
返回值
常用:
darwin
linux
win32
不常用:
aix
cli
cygwin
emscripten
java
wasi
- …
特点:
- 全小写字母
- 名称简洁
解惑
-
为什么只有
win32
, 没有win64
?因为 python 的
sys
模块是与解释器相关的, 跟系统是不是 64 位没有关系. 这里的 “win32” 应该指的是 win32 API, python 的解释器 (无论是 32 位版本还是 64 位版本) 都是基于 win32 API 构建的.这篇文章 对 win32 以及 os, sys, platform 的关系解释得很好.
如果你在意的是系统的架构, 或者想要更详细的信息, 应该用与系统相关的模块:
platform
. -
sys.platform
为什么有这么多值? 平时我只用最常见的那三个值可以吗?为什么那么多值:
如果你用的是 Jython 解释器 (一种 java 版本的 python), 那么
sys.platform
返回的是java
; 如果你用的是 IronPython 解释器, 返回的是cli
(参考).一些其他系统也有特定的返回值 (参考 官方文档):
aix
cygwin
emscripten
wasi
- …
此外, 也要考虑历史因素, python 的旧版本 (小于 v3.8) 对于
sys.platform
返回值有更多变体.只用
darwin
linux
win32
是否足够满足需求:是的. 如果你的目标是为了匹配常见的操作系统, 那么足够使用了.
sys.platform
在狭义上是简单易用的. 但是对于有更复杂需求的开发者, 建议寻找一个第三方库方案.
os.name
https://docs.python.org/3/library/os.html#os.name
返回值
常用:
nt
posix
不常用:
java
特点:
- 全小写字母
- 极为有限的可选值
- 非常简洁
import os
IS_WINDOWS = bool(os.name == 'nt')
解惑
-
os.name
与sys.platform
的适用场景?os.name
更加粗粒度,sys.platform
更加细粒度.我个人常用
os.name
来判断是 windows 还是非 windows. 比如这样:import os IS_WINDOWS = bool(os.name == 'nt')
一般来说,
if IS_WINDOWS: ...
常用作 “特定情况” 对待, 比如转换路径中的反斜杠, 获取 windows 特定的环境变量等.而
sys.platform
被 (我个人) 用来判断 linux/mac/win 三大系统:import sys match sys.platform: case 'darwin': ... case 'linux': ... case 'win32': ...
os.uname
返回值
os.uname()
跟 platform.architecture()
的值基本一致.
示例:
# os.uname()
posix.uname_result(
sysname='Darwin',
nodename='likia-macmini.local',
release='21.2.0',
version='Darwin Kernel Version 21.2.0: Sun Nov 28 20:28:54 PST 2021; root:xnu-8019.61.5~1/RELEASE_X86_64',
machine='x86_64'
)
# tuple(os.uname())
(
'Darwin',
'likia-macmini.local',
'21.2.0',
'Darwin Kernel Version 21.2.0: Sun Nov 28 20:28:54 PST 2021; root:xnu-8019.61.5~1/RELEASE_X86_64',
'x86_64'
)
platform
https://docs.python.org/3/library/platform.html
ps: 官方文档中列出的 platform 方法不是很多, 描述也比较简洁, 有兴趣可以读一下. 下面的内容是从中抽取了本人感兴趣的部分做了示例讲解.
返回值
https://kernel.blog.csdn.net/article/details/45674367
import platform
platform.system()
# 以下四者之一:
# 'Darwin'
# 'Linux'
# 'Windows'
# 'Java' # 不常用
# 注意首字母是大写的.
platform.machine()
# 'x86_64'
# 'amd64'
# ...
# 注意也有可能返回空字符串.
# 判断是 32bit 还是 64bit
platform.architecture()[0]
# '64bit'
# '32bit'
platform.python_version()
# e.g. '3.11.1'
platform.python_version_tuple()
# e.g. ('3', '11', '1')
# ps: 还可以用 sys.version_info 来获取 python 版本
import sys
sys.version_info
# 这是一个 named_tuple 对象:
# sys.version_info(
# major=3,
# minor=11,
# micro=1,
# releaselevel='final',
# serial=0
# )
tuple(sys.version_info)
# (3, 11, 1, 'final', 0)
sys.version_info[:2]
# (3, 11)
sys.version_info[:3]
# (3, 11, 1)