何时使用os.name、sys.platform或platform.system?

144 投票
6 回答
70446 浏览
提问于 2025-04-16 09:09

据我所知,Python有三种方法可以找出当前运行的操作系统:

  1. os.name
  2. sys.platform
  3. platform.system()

知道这些信息通常在条件导入或者使用不同平台的功能时很有用(比如在Windows上用time.clock(),而在UNIX上用time.time())。

我的问题是,为什么会有三种不同的方法呢?什么时候应该用一种方法而不是另一种呢?哪种方法是“最好”的(最具未来适应性,或者最不容易意外排除某个实际上可以运行你程序的系统)?

看起来sys.platformos.name更具体,可以让你区分win32cygwin(而不仅仅是nt),以及linux2darwin(而不仅仅是posix)。但如果是这样,那sys.platformplatform.system()之间又有什么区别呢?

例如,下面哪种写法更好:

import sys
if sys.platform == 'linux2':
    # Do Linux-specific stuff

还是这个更好?:

import platform
if platform.system() == 'Linux':
    # Do Linux-specific stuff

目前我会继续使用sys.platform,所以这个问题并不是特别紧急,但我会非常感激能得到一些关于这个问题的澄清。

6 个回答

12

来自 sys.platform 文档 的内容:

  • os.name 提供的信息比较粗略
  • os.uname() 能给出与系统相关的版本信息
  • platform 模块提供了更详细的系统身份检查

通常,测试某个功能是否可用的“最佳”方法就是直接尝试使用它,如果失败了再用备用方案。

sys.platformplatform.system() 有什么区别呢?

platform.system() 返回一个标准化的值,这个值可能来自多个来源:os.uname()sys.platform,还有 Windows 上的 ver 命令。

25

platform.system()sys.platform 之间有一个微妙的区别,值得注意的是,在大多数情况下,platform.system() 实际上会变成 sys.platform 的结果。

以下是源代码 Python2.7\Lib\Platform.py\system 的内容:

def system():

    """ Returns the system/OS name, e.g. 'Linux', 'Windows' or 'Java'.

        An empty string is returned if the value cannot be determined.

    """
    return uname()[0]

def uname():
    # Get some infos from the builtin os.uname API...
    try:
        system,node,release,version,machine = os.uname()
    except AttributeError:
        no_os_uname = 1

    if no_os_uname or not filter(None, (system, node, release, version, machine)):
        # Hmm, no there is either no uname or uname has returned
        #'unknowns'... we'll have to poke around the system then.
        if no_os_uname:
            system = sys.platform
            release = ''
            version = ''
            node = _node()
            machine = ''

根据文档的说明:

os.uname()

这个函数会返回一个包含5个元素的元组,用来识别当前的操作系统。这个元组包含5个字符串: (sysname, nodename, release, version, machine)。有些系统会把 nodename 截断到8个字符或者只显示前面的部分;获取主机名的更好方法是使用 socket.gethostname(),或者甚至可以用 socket.gethostbyaddr(socket.gethostname())。

Availability: recent flavors of Unix.
91

稍微看了一下源代码。

sys.platformos.name 的输出是在编译时就确定的,而 platform.system() 是在运行时确定系统类型的。

  • sys.platform 是在构建配置时作为编译器的定义来指定的。
  • os.name 会检查某些特定操作系统的模块是否可用(比如 posixnt 等等)。
  • platform.system() 实际上会运行 uname 以及可能的其他几个函数,以在运行时确定系统类型。

我的建议:

  • 使用 os.name 来检查是否是符合 posix 标准的系统。
  • 使用 sys.platform 来检查是否是 linux、cygwin、darwin、atheos 等等。
  • 如果你对其他来源的信息不太相信,可以使用 platform.system()

撰写回答