概念区分: sys.platform, os.name, os.uname, platform 应该用哪个?

先说结论

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.namesys.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)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值